home *** CD-ROM | disk | FTP | other *** search
/ Gold Medal Software 2 / Gold Medal Software Volume 2 (Gold Medal) (1994).iso / prog / asm_0_m.arj / EDCOM42.A86 < prev    next >
Text File  |  1989-12-12  |  47KB  |  2,684 lines

  1. ;EDCOM42 WRITTEN BY DOUG COX, OCTOBER 1987, APRIL 1988, JUNE 1988,
  2. ;NOVEMBER AND DECEMBER, 1989, USING THE SHAREWARE ASSEMBLER, A86
  3. CODE SEGMENT
  4.   JMP MAIN
  5.     DB ' (c)1989 by Doug Cox '
  6. EXPLAIN DB 'Type Edcom42 Filename to view/edit Filename$'
  7. NOFILE    DB ' not found...$'
  8.     DB 8 DUP ('Stack ')
  9. STACKIT DB 'SP'
  10. DISASS    DB 0
  11.     DB '('
  12. SCRNATTRIB DB 017
  13. TOPATTRIB DB 074
  14. MNEMATTRIB DB 078
  15. INSTRATTRIB DB 01F
  16. CHARATTRIB DB 067
  17. HEXATTRIB DB 047
  18.     DB ')'
  19. TOPLINE DB ' CURSOR LOCATION:        CONTENTS:       '
  20. FIND?    DB 'FIND:        '
  21. JUMP?    DB 'JUMP TO:     '
  22. SEARCH    DB ' SEARCHING...'
  23. HELP?    DB ' (F1 FOR HELP)     '
  24. CHARS    DB ' EDITING CHARS'
  25. HEXADEC DB '  EDITING HEX  '
  26. ESCMSG    DB 'ESC or ^KQ : EXIT                    ^KX or ^KD or ^KS : EXIT & save changes',0
  27.     DB 0,'F2 thru F10 : toggle between',0
  28. BLANK    DB '                 1. disable edit capability',0
  29.     DB '                 2. enable edit capability of typeable chars only',0
  30.     DB '                 3. enable edit capability of any character (in hexadecimal)',0
  31.     DB 0,'    Insert or Delete : toggle assembly language translation on & off',0
  32.     DB 0,'Arrow keys or ^S ^E ^X ^D : move cursor    ^W : scroll up   ^Z : scroll down',0
  33.     DB 0,'PgDn or ^C : next screen                   ^PgDn or ^QC : end of file',0
  34.     DB 0,'PgUp or ^R : previous screen               ^PgUp or ^QR : beginning of file',0
  35.     DB 0,'Home or ^QS: left end of line              ^Home or ^QE : top of screen',0
  36.     DB 0,'End  or ^QD: right end of line             ^End  or ^QX : bottom of screen',0
  37.     DB 0,'TAB  or ^F : 10 right                      Shift-TAB or ^A : 10 left',0
  38.     DB 0,'^QF : find hexadecimal or ASCII chars      ^L : continue search',0
  39.     DB ' (examples: FIND: 07 7F ED   FIND: 077FED   FIND: ',027,'and the',027
  40.     DB '   FIND: "can',027,'t")',0
  41.     DB 0,'^J : jump to hexadecimal address in file               [ANY KEY TO RETURN...]'
  42.  
  43. RUTINES DW L00,L01,L02,L03,L04,L05,L06,L06,L00,L01,L02,L03,L04,L05,L0E,RTN ;0
  44.     DW L00,L01,L02,L02,L04,L05,L16,L16,L00,L01,L02,L03,L04,L05,L1E,L1E ;1
  45.     DW L00,L01,L02,L03,L04,L05,RTN,RTN,L00,L01,L02,L03,L04,L05,RTN,RTN ;2
  46.     DW L00,L01,L02,L03,L04,L05,RTN,RTN,L00,L01,L02,L03,L04,L05,RTN,RTN ;3
  47.     DW L40,L41,L42,L43,L44,L45,L46,L47,L40,L41,L42,L43,L44,L45,L46,L47 ;4
  48.     DW L40,L41,L42,L43,L44,L45,L46,L47,L40,L41,L42,L43,L44,L45,L46,L47 ;5
  49.     DW RTN,RTN,RTN,RTN,RTN,RTN,RTN,RTN,RTN,RTN,RTN,RTN,RTN,RTN,RTN,RTN ;6
  50.     DW L70,L70,L70,L70,L70,L70,L70,L70,L70,L70,L70,L70,L70,L70,L70,L70 ;7
  51.     DW L80,L81,RTN,L83,L00,L01,L00,L01,L00,L01,L02,L03,L8C,L03,L8E,L01 ;8
  52.     DW RTN,L91,L92,L93,L94,L95,L96,L97,RTN,RTN,L9A,RTN,RTN,RTN,RTN,RTN ;9
  53.     DW LA0,LA1,LA2,LA3,LA4,LA5,LA4,LA5,L04,L05,LA4,LA5,LA4,LA5,LA4,LA5 ;A
  54.     DW LB0,LB1,LB2,LB3,LB4,LB5,LB6,LB7,LB8,LB9,LBA,LBB,LBC,LBD,LBE,LBF ;B
  55.     DW RTN,RTN,LCA,RTN,LC4,LC4,LC6,LC7,RTN,RTN,LCA,RTN,RTN,LCD,RTN,RTN ;C
  56.     DW LD0,LD1,LD2,LD3,RTN,RTN,RTN,RTN,RTN,RTN,RTN,RTN,RTN,RTN,RTN,RTN ;D
  57.     DW L70,L70,L70,L70,LE4,LE5,LE6,LE7,LE8,LE8,L9A,LEB,LEC,LED,LEE,LEF ;E
  58.     DW RTN,RTN,LF2,LF3,RTN,RTN,LF6,LF7,RTN,RTN,RTN,RTN,RTN,RTN,LFE,LFF ;F
  59.  
  60. EVEN
  61. HANDLE    DW 0
  62. BUFOFF    DW 0
  63. BUFSEG    DW 0
  64. FILEBEG DW 0
  65. FTOPLEF DW 0
  66. TOPLEF    DW 0
  67. LTOPLEF DW 0
  68. FILENDO DW 0
  69. FILENDS DW 0
  70. LASTCOL DW 0
  71. FILSIZO DW 0
  72. FILSIZS DW 0
  73. TEMPFIL DW 0
  74. BEGIN    DW 0
  75. CURLOC    DW 0
  76. SCRNCUR DW 0
  77. OLDSCUR DW 0
  78. ABSLOC1 DW 0
  79. ABSLOC2 DW 0
  80. SAVES    DW 0
  81. HEADSIZ DW 0
  82. SAVEBX    DW 0
  83. STRCNT    DW 0
  84. OLDCUR    DW 0
  85. CURSHPE DW 0
  86. CURPTR    DW 0
  87. BYTE2    DB 0
  88. ISEXE    DB 0
  89. EDFLGS    DB 4
  90. MODE    DB 0
  91. FINDSTR DB 19 DUP(' ')
  92.  
  93. REGB DB 'ALCLDLBLAHCHDHBH'
  94. REGW DB 'AXCXDXBXSPBPSIDI'
  95. SEGS DB 'ESCSSSDS'
  96. BW DB ?
  97. ADDR DB '[BX+SI] [BX+DI] [BP+SI] [BP+DI] [SI]    [DI]    [BP]    [BX]    '
  98.  
  99. __    DB ' '
  100. _AAA    DB 'AAA '
  101. _AAD    DB 'AAD '
  102. _AAM    DB 'AAM '
  103. _AAS    DB 'AAS '
  104. _ADC    DB 'ADC '
  105. _ADD    DB 'ADD '
  106. _AND    DB 'AND '
  107. _CALL    DB 'CALL '
  108. _CBW    DB 'CBW '
  109. _CLC    DB 'CLC '
  110. _CLD    DB 'CLD '
  111. _CLI    DB 'CLI '
  112. _CMC    DB 'CMC '
  113. _CMP    DB 'CMP '
  114. _CMPS    DB 'CMPS '
  115. _CS    DB 'CS '
  116. _CWD    DB 'CWD '
  117. _DAA    DB 'DAA '
  118. _DAS    DB 'DAS '
  119. _DEC    DB 'DEC '
  120. _DIV    DB 'DIV '
  121. _ES    DB 'ES '
  122. _HLT    DB 'HLT '
  123. _IDIV    DB 'IDIV '
  124. _IMUL    DB 'IMUL '
  125. _IN    DB 'IN '
  126. _INC    DB 'INC '
  127. _INT    DB 'INT '
  128. _INT3    DB 'INT_3 '
  129. _INTO    DB 'INTO '
  130. _IRET    DB 'IRET '
  131. _JA    DB 'JA '
  132. _JB    DB 'JB '
  133. _JBE    DB 'JBE '
  134. _JCXZ    DB 'JCXZ '
  135. _JG    DB 'JG '
  136. _JGE    DB 'JGE '
  137. _JL    DB 'JL '
  138. _JLE    DB 'JLE '
  139. _JMP    DB 'JMP '
  140. _JNC    DB 'JNC '
  141. _JNO    DB 'JNO '
  142. _JNS    DB 'JNS '
  143. _JNZ    DB 'JNZ '
  144. _JO    DB 'JO '
  145. _JP    DB 'JP '
  146. _JPE    DB 'JPE '
  147. _JPO    DB 'JPO '
  148. _JS    DB 'JS '
  149. _JZ    DB 'JZ '
  150. _LAHF    DB 'LAHF '
  151. _LDS    DB 'LDS '
  152. _LEA    DB 'LEA '
  153. _LES    DB 'LES '
  154. _LOCK    DB 'LOCK '
  155. _LODS    DB 'LODS '
  156. _LOOP    DB 'LOOP '
  157. _LOOPNZ DB 'LOOPNZ '
  158. _LOOPZ    DB 'LOOPZ '
  159. _MOV    DB 'MOV '
  160. _MOVS    DB 'MOVS '
  161. _MUL    DB 'MUL '
  162. _NEG    DB 'NEG '
  163. _NOP    DB 'NOP '
  164. _NOT    DB 'NOT '
  165. _OR    DB 'OR '
  166. _OUT    DB 'OUT '
  167. _POP    DB 'POP '
  168. _POPF    DB 'POPF '
  169. _PUSH    DB 'PUSH '
  170. _PUSHF    DB 'PUSHF '
  171. _RCL    DB 'RCL '
  172. _RCR    DB 'RCR '
  173. _REP    DB 'REP '
  174. _REPNZ    DB 'REPNZ '
  175. _RET    DB 'RET '
  176. _RETF    DB 'RETF '
  177. _ROL    DB 'ROL '
  178. _ROR    DB 'ROR '
  179. _SAHF    DB 'SAHF '
  180. _SAR    DB 'SAR '
  181. _SBB    DB 'SBB '
  182. _SCAS    DB 'SCAS '
  183. _SHL    DB 'SHL '
  184. _SHR    DB 'SHR '
  185. _SS    DB 'SS '
  186. _STC    DB 'STC '
  187. _STD    DB 'STD '
  188. _STI    DB 'STI '
  189. _STOS    DB 'STOS '
  190. _SUB    DB 'SUB '
  191. _TEST    DB 'TEST '
  192. _WAIT    DB 'WAIT '
  193. _XCHG    DB 'XCHG '
  194. _XLAT    DB 'XLAT '
  195. _XOR    DB 'XOR '
  196.  
  197. INSTRPTR DW _ADD,_ADD,_ADD,_ADD,_ADD,_ADD,_PUSH,_POP        ;0
  198.     DW _OR,_OR,_OR,_OR,_OR,_OR,_PUSH,__
  199.     DW _ADC,_ADC,_ADC,_ADC,_ADC,_ADC,_PUSH,_POP        ;1
  200.     DW _SBB,_SBB,_SBB,_SBB,_SBB,_SBB,_PUSH,_POP
  201.     DW _AND,_AND,_AND,_AND,_AND,_AND,_ES,_DAA        ;2
  202.     DW _SUB,_SUB,_SUB,_SUB,_SUB,_SUB,_CS,_DAS
  203.     DW _XOR,_XOR,_XOR,_XOR,_XOR,_XOR,_SS,_AAA        ;3
  204.     DW _CMP,_CMP,_CMP,_CMP,_CMP,_CMP,_CS,_AAS
  205.     DW _INC,_INC,_INC,_INC,_INC,_INC,_INC,_INC        ;4
  206.     DW _DEC,_DEC,_DEC,_DEC,_DEC,_DEC,_DEC,_DEC
  207.     DW _PUSH,_PUSH,_PUSH,_PUSH,_PUSH,_PUSH,_PUSH,_PUSH    ;5
  208.     DW _POP,_POP,_POP,_POP,_POP,_POP,_POP,_POP
  209.     DW __,__,__,__,__,__,__,__                ;6
  210.     DW __,__,__,__,__,__,__,__
  211.     DW _JO,_JNO,_JB,_JNC,_JZ,_JNZ,_JBE,_JA            ;7
  212.     DW _JS,_JNS,_JP,_JPO,_JL,_JGE,_JLE,_JG
  213.     DW __,__,__,__,_TEST,_TEST,_XCHG,_XCHG            ;8
  214.     DW _MOV,_MOV,_MOV,_MOV,_MOV,_LEA,_MOV,_POP
  215.     DW _NOP,_XCHG,_XCHG,_XCHG,_XCHG,_XCHG,_XCHG,_XCHG    ;9
  216.     DW _CBW,_CWD,_CALL,_WAIT,_PUSHF,_POPF,_SAHF,_LAHF
  217.     DW _MOV,_MOV,_MOV,_MOV,_MOVS,_MOVS,_CMPS,_CMPS        ;A
  218.     DW _TEST,_TEST,_STOS,_STOS,_LODS,_LODS,_SCAS,_SCAS
  219.     DW _MOV,_MOV,_MOV,_MOV,_MOV,_MOV,_MOV,_MOV        ;B
  220.     DW _MOV,_MOV,_MOV,_MOV,_MOV,_MOV,_MOV,_MOV
  221.     DW __,__,_RET,_RET,_LES,_LDS,_MOV,_MOV            ;C
  222.     DW __,__,_RETF,_RETF,_INT3,_INT,_INTO,_IRET
  223.     DW __,__,__,__,_AAM,_AAD,__,_XLAT            ;D
  224.     DW __,__,__,__,__,__,__,__
  225.     DW _LOOPNZ,_LOOPZ,_LOOP,_JCXZ,_IN,_IN,_OUT,_OUT     ;E
  226.     DW _CALL,_JMP,_JMP,_JMP,_IN,_IN,_OUT,_OUT
  227.     DW _LOCK,__,_REPNZ,_REP,_HLT,_CMC,__,__         ;F
  228.     DW _CLC,_STC,_CLI,_STI,_CLD,_STD,__,__
  229.  
  230. IMMED DW _ADD,_OR,_ADC,_SBB,_AND,_SUB,_XOR,_CMP
  231. SHIFT DW _ROL,_ROR,_RCL,_RCR,_SHL,_SHR,__,_SAR
  232. GRP1 DW _TEST,__,_NOT,_NEG,_MUL,_IMUL,_DIV,_IDIV
  233. GRP2 DW _INC,_DEC,_CALL,_CALL,_JMP,_JMP,_PUSH,__
  234. ISGGPTRS DW IMMED,SHIFT,GRP1,GRP2
  235.  
  236. MAIN:
  237. ;GET MAX FILE SIZE
  238.   MOV AH,04A        ;FUNCTION TO MODIFY EXTRA MEMORY
  239.   MOV BX,0FFFF        ;LARGE ENOUGH TO MAKE FUNCTION FAIL (& GIVE AVAIL SPACE)
  240.   INT 021
  241.   MOV AX,BX        ;AVAILABLE MEMORY IN PARAGRAPHS (16 BYTES/PARAGRAPH)
  242.   ADD AX,0FB        ;EXTRA SPACE USED AT END OF THIS PROGRAM (IN PARAGRAPHS)
  243.   SUB DX,DX
  244.   MOV BX,16
  245.   MUL BX        ;TO GET FREE MEMORY SPACE IN BYTES
  246.   MOV FILSIZS,DX    ;TEMPORARY
  247.   MOV FILSIZO,AX    ;DITTO
  248.  
  249. ;PREPARE TO READ FILE TO MEMORY BUFFER
  250.   MOV AL,B[080]     ;DTA
  251.   SUB AH,AH
  252.   OR AL,AL
  253.   JNZ CONTINU        ;IF FILENAME WAS ON COMMAND LINE
  254.   MOV DX,OFFSET EXPLAIN
  255.   MOV AH,9
  256.   INT 021
  257.   MOV AX,04C00
  258.   INT 021
  259. CONTINU:
  260.   MOV CX,AX        ;SIZE OF FILENAME
  261.   ADD AX,081
  262.   MOV SI,AX
  263.   MOV [SI],AH        ;PUT ASCIIZ 0 AT END OF STRING
  264. ;CHECK FOR .COM OR .EXE FILE
  265.   MOV DI,082
  266.   MOV AL,'.'
  267.   REPNE SCASB
  268.   JCXZ NOEXE
  269.   CMP W[DI],'OC'
  270.   JNZ NOTCOM
  271.   CMP B[DI+2],'M'
  272.   JNZ NOTCOM
  273.   MOV W[BEGIN],0100    ;BEGINNING ADDRESS OF .COM FILES IS 0100
  274.   JMP SHORT NOEXE
  275. NOTCOM:
  276.   CMP W[DI],'XE'
  277.   JNZ NOEXE
  278.   CMP B[DI+2],'E'
  279.   JNZ NOEXE
  280.   MOV B[ISEXE],0FF    ;FLAG
  281. NOEXE:
  282.   MOV DX,082
  283.   MOV AX,03D02        ;OPEN FUNCTION (FOR READ/WRITE)
  284.   INT 021
  285.   IF C JMP NOTHERE
  286.   MOV HANDLE,AX
  287.  
  288. ;MOVE STACK & CHECK SCREEN
  289.   MOV AX,OFFSET STACKIT
  290.   MOV SP,AX
  291.   MOV AH,0F        ;FUNCTION TO CHECK SCREEN MODE
  292.   INT 010
  293.   MOV MODE,AL        ;SAVE IT
  294.  
  295. ;SAVE OLD CURSOR LOCATION
  296.   CALL GETCUR
  297.   DEC DH
  298.   MOV OLDCUR,DX     ;ROW IN DH / COL IN DL
  299.   MOV CURSHPE,CX    ;STARTING & ENDING LINE FOR CURSOR
  300.  
  301. ;SAVE OLD SCREEN
  302.   MOV DI,OLDSCR
  303.   MOV AX,0B000        ;VIDEO MEMORY ADDRESS
  304.   CMP MODE,7
  305.   IF NZ MOV AX,0B800    ;IF CGA DISPLAY
  306.   MOV DS,AX
  307.   SUB SI,SI
  308.   MOV CX,2000
  309.   REP MOVSW
  310.   MOV ES,AX
  311.   MOV AX,CS
  312.   MOV DS,AX
  313.  
  314. ;GET FILE SIZE
  315.   MOV AX,04202
  316.   MOV BX,HANDLE
  317.   SUB CX,CX
  318.   SUB DX,DX
  319.   INT 021        ;FILE SIZE IN DX:AX (E.G. 1:2345H)
  320.   IF C JMP EXIT
  321. ;CHECK IF IT WILL FIT IN AVAILABLE MEMORY
  322.   CMP DX,FILSIZS
  323.   JC >L1
  324.   CMP AX,FILSIZO
  325.   IF NC INT 020     ;IF FILE WOULDN'T FIT
  326. L1:
  327.   MOV FILSIZS,DX
  328.   MOV FILSIZO,AX
  329.  
  330. ;RESET FILE POINTER TO START OF FILE
  331.   MOV AX,04200
  332.   MOV BX,HANDLE
  333.   SUB CX,CX
  334.   SUB DX,DX
  335.   INT 021
  336.  
  337. ;GET NEW BUFFER SEGMENT ADDRESS & MEMORY ADDR THAT GOES AT TOP LEFT OF SCREEN
  338.   MOV AX,PREBUF     ;AT END OF THIS CODE (PAST ANOTHER BUFFER)
  339.   MOV CL,4
  340.   SHR AX,CL        ;CHANGE OFFSET-TYPE ADDRESS TO SEGMENT-TYPE ADDRESS
  341.   MOV DX,DS
  342.   ADD AX,DX
  343.   MOV FILEBEG,AX    ;NEW SEGMENT ADDRESS BEGINS AT BUFFER
  344.   MOV BX,AX
  345.   SHL AX,CL        ;SHIFT 1 NIBBLE LEFT FOR OFFSET ADDR
  346.   ROL BX,CL        ;MOVE LEFT NIBBLE TO RIGHT
  347.   AND BX,0F        ;CLEAR ALL BUT RIGHT-MOST NIBBLE
  348.   MOV BUFSEG,BX     ;FOR USE IN FIND
  349.   MOV BUFOFF,AX     ;DITTO
  350.  
  351. ;READ FILE INTO MEMORY BUFFER
  352.   MOV BX,HANDLE
  353.   MOV BP,FILSIZS
  354.   MOV AX,FILSIZO
  355.   MOV DX,FILEBEG
  356. READFILE:
  357.   MOV TEMPFIL,AX
  358.   MOV CX,0FFF0
  359.   OR BP,BP
  360.   IF Z MOV CX,AX    ;IF ONLY 1 SEGMENT TO READ
  361.   MOV DS,DX
  362.   PUSH DX
  363.   SUB DX,DX
  364.   MOV AH,03F        ;FUNCTION TO READ FILE
  365.   INT 021
  366.   MOV DX,CS
  367.   MOV DS,DX
  368.   POP DX
  369.   ADD DX,0FFF        ;TO INCREMENT DS
  370.   IF C JMP EXIT
  371.   OR AX,AX
  372.   IF Z JMP EXIT
  373.   MOV AX,TEMPFIL
  374.   SUB AX,0FFF0
  375.   SBB BP,0
  376.   JNS READFILE        ;IF IT DIDN'T DECREMENT LESS THAN 0
  377.  
  378.   CALL DISPLTOP     ;PUT TOP LINE ON SCREEN
  379.   MOV AH,1        ;FUNCTION TO CHANGE CURSOR SHAPE
  380.   MOV CX,7        ;TOP & BOTTOM ROW OF CURSOR
  381.   INT 010
  382.  
  383. ;PUT BORDER AROUND SCREEN
  384.   MOV AH,0B
  385.   MOV BL,SCRNATTRIB
  386.   MOV CL,4
  387.   SHR BX,CL
  388.   AND BX,0F
  389.   INT 010
  390.  
  391. ;CHECK FOR .EXE FILE
  392.   MOV SI,FILEBEG    ;BEGINNING OF FILE IN MEMORY
  393.   CMP B[ISEXE],0FF
  394.   JNZ NOTEXE
  395.   MOV DS,SI
  396.   CMP W[0],05A4D    ;'MZ' IS AT BEGINNING OF ALL .EXE FILES
  397.   JNZ NOTEXE
  398.   MOV AX,W[0008]    ;WHERE LENGTH OF HEADER IS LOCATED
  399.   ADD SI,AX        ;MOVE PAST HEADER
  400.   MOV CL,4
  401.   SHL AX,CL
  402.   CS MOV HEADSIZ,AX
  403.   MOV AX,W[0016]    ;CODE SEGMENT DISPLACEMENT
  404.   SUB BX,BX
  405.   SHL AX,CL        ;CHANGE FROM SEGMENT TO OFFSET
  406.   ADC BX,0        ;SEGMENT
  407.   ADD AX,W[0014]    ;INSTRUCTION POINTER OFFSET
  408.   ADC BX,0
  409.   MOV DX,CS
  410.   MOV DS,DX
  411.   MOV SAVES,AX        ;OFFSET
  412.   MOV SAVEBX,BX     ;SEGMENT
  413. NOTEXE:
  414.   MOV AX,CS
  415.   MOV DS,AX
  416.   MOV FTOPLEF,SI
  417.  
  418. ;GET FILE END ADDRESS
  419.   MOV BX,BUFSEG
  420.   MOV AX,BUFOFF
  421.   ADD AX,FILSIZO
  422.   ADC BX,FILSIZS
  423.   MOV FILENDS,BX
  424.   MOV FILENDO,AX
  425.  
  426. ;GET LAST COLUMN
  427.   MOV DX,FILSIZS
  428.   MOV AX,FILSIZO
  429.   SUB AX,1
  430.   SBB DX,0
  431.   SUB AX,HEADSIZ
  432.   SBB DX,0
  433.   MOV CX,80
  434.   DIV CX        ;DX:AX/CX (TO GET REMAINDER IN DX)
  435.   MOV LASTCOL,DX    ;COLUMNS ON LAST ROW
  436.  
  437. ;GET LAST TOPLEF
  438.   MOV AX,FILENDO
  439.   MOV BX,FILENDS
  440.   SUB FILENDO,1
  441.   SBB FILENDS,0
  442.   SUB AX,DX        ;TO BEGINNING OF LAST LINE
  443.   SBB BX,0
  444.   SUB AX,1840        ;TO TOP LEFT OF SCREEN (23*80)
  445.   SBB BX,0
  446.   MOV CL,4
  447.   SHR AX,CL
  448.   ROR BX,CL        ;PUT RIGHT NIBBLE ON LEFT
  449.   ADD AX,BX
  450.   MOV LTOPLEF,AX
  451. ;JUMP TO BEGINNING OF CODE IF .EXE FILE
  452.   MOV DI,SAVES
  453.   OR DI,DI
  454.   JZ FILETOP
  455.   MOV BX,SAVEBX
  456.   JMP ITSEXE
  457.  
  458. ;JUMPED TO WITH ^PGUP
  459. FILETOP:
  460.   MOV SI,FTOPLEF
  461.   MOV TOPLEF,SI     ;BEGINNING OF SEGMENT IS ALWAYS AT TOPLEF
  462.   MOV CURPTR,0        ;CURSOR OFFSET LOCATION
  463.   MOV DX,0100        ;ROW 1/COLUMN 0
  464.   CALL MOVCUR        ;INITIALIZE CURSOR AT TOP LEFT
  465.  
  466. ;DISPLAY FILE
  467. NEWSCRN:
  468.   MOV AH,SCRNATTRIB
  469.   CMP MODE,7        ;MONOCHROME
  470.   IF Z MOV AH,7
  471.   SUB SI,SI        ;OFFSET OF FILE TO PUT ON SCREEN
  472.   MOV DI,160        ;TOP LEFT OF SCREEN
  473.   MOV DX,TOPLEF
  474.   CMP DX,LTOPLEF
  475.   JNC ATEND
  476.   MOV CX,1920        ;80*24 SCREEN
  477.   CMP DISASS,0
  478.   MOV DS,DX        ;TOPLEF IS ALSO DATA SEGMENT BEGINNING
  479.   JZ DONTSHOALL
  480.   CALL MOVIT        ;LODSB, STOSW, LOOP
  481.   JMP SHORT NEW2
  482. DONTSHOALL:
  483.   CALL MOVIT2
  484.   JMP SHORT NEW2
  485. ATEND:
  486.   MOV BX,FILENDO
  487.   MOV DS,DX        ;TOPLEF
  488.   MOV CL,4
  489.   SHL DX,CL        ;TO GET OFFSET VALUE OF TOPLEF
  490.   NEG DX
  491.   ADD BX,DX        ;FILENDO-TOPLEF
  492.   INC BX
  493.   MOV CX,BX
  494.   CS CMP DISASS,0
  495.   JZ DONTSHOALL2
  496.   CALL MOVIT        ;PUT LAST PAGE OF FILE ON SCREEN
  497.   JMP SHORT >L1
  498. DONTSHOALL2:
  499.   CALL MOVIT2
  500. L1:
  501.   MOV DX,CS
  502.   MOV DS,DX        ;PUT DATA SEG BACK
  503.   MOV CX,1920        ;80*24 SCREEN (NOT COUNTING TOP LINE)
  504.   SUB CX,BX        ;SCREEN SIZE - (FILEND-TOPLEF)
  505.   MOV AH,SCRNATTRIB
  506.   CMP MODE,7        ;MONOCHROME
  507.   IF Z MOV AH,7
  508.   MOV AL,' '
  509.   REP STOSW        ;PUT CX BLANKS TO END OF SCREEN
  510. NEW2:
  511.   MOV DX,CS
  512.   MOV DS,DX        ;PUT DATA SEG BACK
  513.  
  514. ;PUT CURSOR LOCATION & CONTENTS AT SCREEN TOP
  515.   MOV DX,TOPLEF ;DATA SEGMENT
  516.   SUB DX,FTOPLEF    ;TO MAKE TOPLEF RELATIVE TO FTOPLEF
  517.   MOV BX,DX        ;FOR FIRST BIN2HEX CALL
  518.   MOV CL,4
  519.   SHL DX,CL
  520.   ADD DX,CURPTR     ;OFFSET ADDR
  521.   IF C ADD BX,01000    ;INCREMENT 5TH BYTE
  522.   ADD DX,BEGIN
  523.   IF C ADD BX,01000
  524.   MOV ABSLOC1,BX
  525.   MOV ABSLOC2,DX
  526.   MOV DI,36        ;LOCATION ON SCREEN
  527.   MOV CH,1        ;FOR COUNT
  528.   CALL BIN2HEX        ;SHOW 5TH BYTE OF LOCATION
  529.   MOV BX,DX
  530.   MOV CH,4
  531.   CALL BIN2HEX        ;SHOW OTHER 4 BYTES OF LOCATION
  532.  
  533.   MOV SI,CURPTR     ;CURSOR LOCATION IN MEMORY
  534.   MOV DS,TOPLEF
  535.   MOV BH,[SI]        ;CONTENTS
  536.   MOV CX,CS
  537.   MOV DS,CX
  538.   MOV DI,70        ;SCREEN LOC
  539.   MOV CH,2        ;2 CHARS
  540.   CALL BIN2HEX
  541.  
  542. DIS:
  543.   MOV AH,MNEMATTRIB
  544.   CMP MODE,7
  545.   IF Z MOV AH,070
  546.   CMP EDFLGS,4
  547.   JNZ WATE        ;IF EDITING CHARS OR HEX
  548.   MOV AL,' '
  549.   MOV DI,78
  550.   MOV CX,25
  551.   REP STOSW        ;CLEAR PREVIOUS INSTRUCTIONS
  552.   CMP DISASS,0FF
  553.   JNZ WATE        ;IF NOT SHOWING DISASSEMBLY
  554.  
  555.   MOV DX,CURLOC     ;CURSOR LOCATION ON SCREEN
  556.   SHL DL,1        ;DOUBLE ROW NUMBER
  557.   MOV AL,DH        ;COLUMN
  558.   MOV CL,160
  559.   MUL CL
  560.   SUB DH,DH
  561.   ADD AX,DX
  562.   INC AX        ;TO WHERE CHAR ATTRIBUTE GOES
  563.   MOV DI,AX
  564.   MOV OLDSCUR,AX    ;OLD SCREEN CURSOR LOCATION
  565.   MOV SCRNCUR,AX
  566.   MOV AL,INSTRATTRIB
  567.   CMP MODE,7
  568.   IF Z MOV AL,070
  569.   ES MOV B[DI],AL    ;HILITE FIRST INSTRUCTION BYTE
  570.   ADD SCRNCUR,2
  571.   MOV DI,82
  572. DIS2:
  573.   MOV BX,OFFSET INSTRPTR
  574.   MOV DS,TOPLEF
  575.   LODSB
  576.   MOV CX,CS
  577.   MOV DS,CX
  578.   SUB AH,AH
  579.   SHL AX,1
  580.   PUSH SI,AX
  581.   ADD BX,AX
  582.   MOV SI,[BX]        ;LOCATION OF FIRST INSTRUCTION IN INSTRPTR
  583.   MOV AH,MNEMATTRIB
  584.   CMP MODE,7
  585.   IF Z MOV AH,070
  586. INSTRLP:
  587.   LODSB
  588.   STOSW
  589.   CMP AL,' '
  590.   JNZ INSTRLP
  591.   POP AX,SI
  592.   MOV BX,OFFSET RUTINES
  593.   ADD BX,AX
  594.   CALL [BX]
  595.  
  596. ;READ KEYBOARD
  597. WATE:
  598.   SUB AH,AH        ;FUNCTION TO READ KEYBOARD
  599.   INT 016        ;PROGRAM STAYS HERE, MOSTLY
  600.   OR AL,AL
  601.   JZ  EXTENDED_CODE
  602.   CMP AL,' '
  603.   JL CTRL_CODE
  604.   JMP INPUT
  605.  
  606. CTRL_CODE:
  607.   CALL CASE    ;TO JUMP TO FOLLOWING SUBROUTINES
  608.   DB 17     ;NUMBER OF FOLLOWING SUBROUTINES
  609.   DB 10     ;^J
  610.   DW JUMP
  611.   DB 12     ;^L
  612.   DW AGAIN
  613.   DB 27     ;ESC
  614.   DW EXIT
  615.   DB 18     ;^R
  616.   DW PREV
  617.   DB 3        ;^C
  618.   DW NEXT
  619.   DB 5        ;^E
  620.   DW CURUP
  621.   DB 24     ;^X
  622.   DW CURDN
  623.   DB 19     ;^S
  624.   DW CURLFT
  625.   DB 4        ;^D
  626.   DW CURRT
  627.   DB 23     ;^W
  628.   DW UP
  629.   DB 26     ;^Z
  630.   DW DOWN
  631.   DB 6        ;^F
  632.   DW MOVRT
  633.   DB 1        ;^A
  634.   DW MOVLFT
  635.   DB 9        ;TAB
  636.   DW MOVRT
  637.   DB 11     ;^K
  638.   DW KMENU
  639.   DB 17     ;^Q
  640.   DW QMENU
  641.   DB 13     ;ENTER
  642.   DW INPUT
  643.   DW WATE
  644.  
  645. EXTENDED_CODE:
  646.   MOV AL,AH
  647.   CALL CASE
  648.   DB 27     ;NUMBER OF SUBROUTINES TO CHECK
  649.   DB 59     ;F1
  650.   DW EMENU
  651.   DB 60     ;F2
  652.   DW EDIT
  653.   DB 61     ;F3
  654.   DW EDIT
  655.   DB 62     ;F4
  656.   DW EDIT
  657.   DB 63
  658.   DW EDIT
  659.   DB 64
  660.   DW EDIT
  661.   DB 65
  662.   DW EDIT
  663.   DB 66
  664.   DW EDIT
  665.   DB 67
  666.   DW EDIT
  667.   DB 68     ;F10
  668.   DW EDIT
  669.   DB 71     ;HOME
  670.   DW LFTSIDE
  671.   DB 79     ;END
  672.   DW RTSIDE
  673.   DB 73     ;PGUP
  674.   DW PREV
  675.   DB 81     ;PGDN
  676.   DW NEXT
  677.   DB 72     ;UP ARROW
  678.   DW CURUP
  679.   DB 80     ;DOWN ARROW
  680.   DW CURDN
  681.   DB 75     ;LEFT ARROW
  682.   DW CURLFT
  683.   DB 77     ;RIGHT ARROW
  684.   DW CURRT
  685.   DB 116    ;^RIGHT ARROW
  686.   DW MOVRT
  687.   DB 115    ;^LEFT ARROW
  688.   DW MOVLFT
  689.   DB 132    ;^PGUP
  690.   DW FILETOP
  691.   DB 118    ;^PGDN
  692.   DW GOEND
  693.   DB 119    ;^HOME
  694.   DW SCRTOP
  695.   DB 117    ;^END
  696.   DW SCRBOT
  697.   DB 15     ;SHIFT-TAB
  698.   DW MOVLFT
  699.   DB 82     ;INSERT
  700.   DW TOGGLEDIS
  701.   DB 83     ;DELETE
  702.   DW TOGGLEDIS
  703.   DW WATE    ;GO THERE IF NOT ONE OF ABOVE
  704.  
  705. QMENU:
  706.   MOV B ES:[122],'^'
  707.   MOV B ES:[124],'Q'
  708.   SUB AH,AH
  709.   INT 016H
  710.   MOV B ES:[122],' '
  711.   MOV B ES:[124],' '
  712.   AND AL,01F
  713.   CALL CASE
  714.   DB 7        ;NUMBER OF FOLLOWING SUBROUTINES
  715.   DB 18     ;^R
  716.   DW FILETOP
  717.   DB 3        ;^C
  718.   DW GOEND
  719.   DB 5        ;^E
  720.   DW SCRTOP
  721.   DB 24     ;^X
  722.   DW SCRBOT
  723.   DB 19     ;^S
  724.   DW LFTSIDE
  725.   DB 4        ;^D
  726.   DW RTSIDE
  727.   DB 6        ;^F
  728.   DW FIND
  729.   DW WATE
  730.  
  731. KMENU:
  732.   MOV B ES:[122],'^'
  733.   MOV B ES:[124],'K'
  734.   SUB AH,AH
  735.   INT 016
  736.   MOV B ES:[122],' '
  737.   MOV B ES:[124],' '
  738.   AND AL,01F
  739.   CALL CASE
  740.   DB 4
  741.   DB 17     ;^Q
  742.   DW EXIT
  743.   DB 24     ;^X
  744.   DW WRITE
  745.   DB 4        ;^D
  746.   DW WRITE
  747.   DB 19     ;^S
  748.   DW WRITE
  749.   DW WATE
  750.  
  751. INPUT:
  752.   CMP DISASS,0FF
  753.   JNZ NOJUMP        ;IF NOT SHOWING DISASSEMBLY
  754.   CMP EDFLGS,4
  755.   JNZ NOJUMP        ;IF EDITING CHARS OR HEX
  756.   MOV CX,SCRNCUR
  757.   SUB CX,OLDSCUR
  758.   JZ NOJUMP
  759.   SHR CX,1
  760. NEXTINSTR:
  761.   PUSH CX
  762.   CALL RTCUR        ;MOVE CURSOR RIGHT TO NEXT INSTRUCTION
  763.   POP CX
  764.   LOOP NEXTINSTR
  765.   JMP NEWSCRN
  766. NOJUMP:
  767.   CMP EDFLGS,2
  768.   JNZ HEXINPUT
  769.   MOV SI,CURPTR
  770.   MOV DS,TOPLEF
  771.   CMP B[SI],' '
  772.   JB NOTHEX
  773.   CMP B[SI],'~'
  774.   JA NOTHEX
  775.   MOV [SI],AL        ;PUT INPUT IN MEMORY
  776.   MOV DX,CS
  777.   MOV DS,DX
  778.   MOV AH,0AH        ;FUNCTION TO WRITE CHAR TO SCREEN
  779.   SUB BH,BH        ;SCREEN PAGE
  780.   MOV CX,1
  781.   INT 010
  782.   JMP CURRT
  783.  
  784. HEXINPUT:
  785.   CMP EDFLGS,3
  786.   IF NZ JMP WATE
  787.   MOV BL,AL        ;SAVE INPUT
  788.   CALL HEX2BIN
  789.   JC NOTHEX        ;IF NOT GOOD HEX INPUT
  790.   MOV DL,AL        ;SAVE BINARY REPRESENTATION
  791.   CMP BL,'a'
  792.   IF NC SUB BL,020    ;MAKE LETTERS UPPERCASE
  793.   ES MOV [70],BL    ;DISPLAY FIRST HEX INPUT
  794.   ES MOV B[72],'_'
  795.   SUB AH,AH
  796.   INT 016
  797.   MOV BH,AL        ;SAVE SECOND HEX INPUT
  798.   CALL HEX2BIN
  799.   JC NOTHEX
  800.   MOV DH,AL        ;SAVE SECOND BINARY REPRESENTATION
  801.   ES MOV [72],BH    ;DISPLAY SECOND INPUT
  802.   MOV CL,4
  803.   SHL DL,CL
  804.   OR DL,DH
  805.   MOV SI,CURPTR
  806.   MOV DS,TOPLEF
  807.   MOV [SI],DL        ;PUT REVISION IN MEMORY
  808.   MOV CX,CS
  809.   MOV DS,CX
  810.   JMP NEWSCRN
  811.  
  812. NOTHEX:
  813.   MOV DX,CS
  814.   MOV DS,DX
  815.   MOV AL,7        ;BEEP
  816.   MOV AH,0E        ;FUNCTION TO WRITE CHAR
  817.   SUB BH,BH        ;PAGE
  818.   MOV CX,1
  819.   INT 010
  820.   JMP NEWSCRN
  821.  
  822. TOGGLEDIS:
  823.   XOR DISASS,0FF
  824.   JMP NEWSCRN
  825.  
  826. EDIT:
  827.   CALL DISPLTOP
  828.   INC EDFLGS
  829.   CMP EDFLGS,5
  830.   IF Z MOV EDFLGS,2
  831.   CMP EDFLGS,2
  832.   JZ EDCHARS
  833.   CMP EDFLGS,3
  834.   JZ EDHEX
  835. UNEDIT:
  836.   MOV EDFLGS,4
  837.   MOV SI,OFFSET HELP?
  838.   MOV AH,TOPATTRIB
  839.   JMP SHORT SHOIT
  840. EDCHARS:
  841.   MOV SI,OFFSET CHARS
  842.   MOV AH,CHARATTRIB
  843.   JMP SHORT PRESHOIT
  844. EDHEX:
  845.   MOV SI,OFFSET HEXADEC
  846.   MOV AH,HEXATTRIB
  847. PRESHOIT:
  848.   PUSH AX,SI
  849.   MOV AH,TOPATTRIB
  850.   CMP MODE,7
  851.   IF Z MOV AH,070
  852.   MOV SI,OFFSET HELP?
  853.   MOV DI,82
  854.   MOV CX,20
  855.   CALL MOVIT
  856.   POP SI,AX
  857. SHOIT:
  858.   CMP MODE,7
  859.   IF Z MOV AH,070
  860.   MOV DI,130
  861.   MOV CX,15
  862.   CALL MOVIT
  863.   JMP NEWSCRN
  864.  
  865. ;F1
  866. EMENU:
  867.   MOV SI,OFFSET ESCMSG
  868. EMENU2:
  869.   CALL HIDECUR
  870.   CALL MENWRT
  871.   CMP AL,11        ;^K
  872.   JNZ NOTCTRLK
  873.   MOV B ES:[442],'^'
  874.   MOV B ES:[444],'K'
  875.   SUB AH,AH
  876.   INT 016
  877.   MOV B ES:[442],' '
  878.   MOV B ES:[444],' '
  879.   AND AL,01F
  880.   CMP AL,17        ;^Q
  881.   IF Z JMP EXIT
  882.   CMP AL,24        ;^X
  883.   IF Z JMP WRITE
  884.   CMP AL,4        ;^D
  885.   IF Z JMP WRITE
  886.   CMP AL,19        ;^S
  887.   IF Z JMP WRITE
  888. NOTCTRLK:
  889.   PUSH AX
  890.   MOV DX,CURLOC
  891.   CALL MOVCUR
  892.   POP AX
  893.   CMP AX,03C00        ;F2
  894.   JB >L1
  895.   CMP AX,04400        ;F10
  896.   IF BE JMP EDIT
  897. L1:
  898.   PUSH AX
  899.   CALL DISPLTOP
  900.   POP AX
  901.   CMP AX,05200        ;INSERT
  902.   IF Z XOR DISASS,0FF
  903.   CMP AX,05300        ;DELETE
  904.   IF Z XOR DISASS,0FF
  905.   CMP EDFLGS,2
  906.   IF Z JMP EDCHARS
  907.   CMP EDFLGS,3
  908.   IF Z JMP EDHEX
  909.   JMP NEWSCRN
  910.  
  911. ;***CURSOR MOVEMENT***
  912.  
  913. ;^HOME
  914. SCRTOP:
  915.   MOV DX,CURLOC
  916.   MOV AL,80
  917.   MUL DH
  918.   SUB CURPTR,AX
  919.   ADD CURPTR,80     ;BECAUSE TOP ROW HERE IS 1 NOT 0
  920.   MOV DH,1        ;TOP ROW
  921.   CALL MOVCUR
  922.   JMP NEWSCRN
  923.  
  924. ;^END
  925. SCRBOT:
  926.   MOV DX,CURLOC
  927.   MOV AL,24        ;BOTTOM ROW
  928.   SUB AL,DH        ;CURSOR ROW
  929.   MOV AH,80
  930.   MUL AH
  931.   ADD CURPTR,AX
  932. ;NOW TEST FOR END OF FILE
  933.   MOV AX,TOPLEF     ;SEGMENT & TOPLEFT OF SCREEN
  934.   CMP AX,LTOPLEF
  935.   JNC SCRBOT2        ;IF AT OR PAST LAST TOPLEFT
  936.   MOV DH,24        ;BOTTOM ROW
  937.   CALL MOVCUR
  938.   JMP NEWSCRN
  939. SCRBOT2:
  940.   CALL CUREND
  941.   JMP NEWSCRN
  942.  
  943. ;^PGDN
  944. GOEND:
  945.   MOV AX,LTOPLEF
  946.   CMP AX,TOPLEF
  947.   JC SCRBOT        ;IF FILE DOESN't fill screen
  948.   MOV TOPLEF,AX
  949.   MOV AX,LASTCOL
  950.   MOV DX,AX
  951.   MOV DH,018H        ;ROW 24
  952.   ADD AX,1840        ;80*23
  953.   MOV CURPTR,AX
  954.   CALL MOVCUR
  955.   JMP NEWSCRN
  956.  
  957. ;HOME
  958. LFTSIDE:
  959.   MOV DX,CURLOC
  960.   PUSH DX
  961.   SUB DH,DH
  962.   SUB CURPTR,DX     ;DECREMENT CURPTR TO 1ST COL
  963.   POP DX
  964.   SUB DL,DL
  965.   CALL MOVCUR
  966.   JMP NEWSCRN
  967.  
  968. ;END
  969. RTSIDE:
  970.   MOV AX,TOPLEF
  971.   CMP AX,LTOPLEF
  972.   JC RTSIDE2
  973.   MOV CL,4
  974.   SHL AX,CL
  975.   ADD AX,CURPTR
  976.   MOV BX,FILENDO
  977.   SUB BX,LASTCOL
  978.   CMP AX,BX        ;BEGINNING OF LAST LINE OF FILE
  979.   JC RTSIDE2
  980.   CALL CUREND
  981.   JMP NEWSCRN
  982.  
  983. RTSIDE2:
  984.   MOV DX,CURLOC
  985.   MOV AL,79
  986.   SUB AL,DL
  987.   SUB AH,AH
  988.   ADD CURPTR,AX
  989.   MOV DL,79
  990.   CALL MOVCUR
  991.   JMP NEWSCRN
  992.  
  993. ;PGUP
  994. PREV:
  995.   MOV AX,FTOPLEF
  996.   CMP AX,TOPLEF
  997.   IF Z JMP WATE
  998.   ADD AX,078        ;1920D SHIFTED RIGHT (24*80) SCREEN
  999.   CMP AX,TOPLEF
  1000.   IF NC JMP FILETOP
  1001.   SUB TOPLEF,078
  1002.   JMP NEWSCRN
  1003.  
  1004. ;PGDN
  1005. NEXT:
  1006.   MOV AX,TOPLEF
  1007.   CMP AX,LTOPLEF
  1008.   IF NC JMP WATE    ;IF AT END OF FILE
  1009.   ADD AX,078        ;1920D SHIFTED RIGHT
  1010.   MOV TOPLEF,AX
  1011.   CMP AX,LTOPLEF
  1012.   IF NC CALL CUREND
  1013.   JMP NEWSCRN
  1014.  
  1015. ;LEFT ARROW
  1016. CURLFT:
  1017.   CALL LFTCUR
  1018.   JMP NEWSCRN
  1019.   
  1020. ;RIGHT ARROW
  1021. CURRT:
  1022.   CALL RTCUR
  1023.   JMP NEWSCRN
  1024.  
  1025. ;^RIGHT ARROW
  1026. MOVRT:
  1027.   MOV CX,10
  1028. RTLP:
  1029.   PUSH CX
  1030.   CALL RTCUR
  1031.   POP CX
  1032.   LOOP RTLP
  1033.   JMP NEWSCRN
  1034.  
  1035. ;^LEFT ARROW
  1036. MOVLFT:
  1037.   MOV CX,10
  1038. LFTLP:
  1039.   PUSH CX
  1040.   CALL LFTCUR
  1041.   POP CX
  1042.   LOOP LFTLP
  1043.   JMP NEWSCRN
  1044.  
  1045. ;UP ARROW
  1046. CURUP:
  1047.   CALL SCRLOCK
  1048.   JNZ UP        ;IF SCROLLLOCK IS ON
  1049.   MOV DX,CURLOC
  1050.   CMP DH,1
  1051.   JE CURUP2        ;IF ON TOP LINE
  1052.   DEC DH
  1053.   CALL MOVCUR
  1054.   SUB CURPTR,80
  1055.   JMP NEWSCRN
  1056.  
  1057. CURUP2:
  1058.   MOV AX,TOPLEF
  1059.   CMP AX,FTOPLEF
  1060.   IF Z JMP WATE
  1061.   SUB TOPLEF,5
  1062.   JMP NEWSCRN
  1063.  
  1064. ;SCROLLLOCK ON
  1065. UP:
  1066.   MOV AX,TOPLEF
  1067.   CMP AX,FTOPLEF
  1068.   IF Z JMP WATE     ;IF AT BEGINNING OF FILE
  1069.   SUB TOPLEF,5
  1070.   MOV DX,CURLOC
  1071.   CMP DH,24
  1072.   JE DOWNEND        ;IF AT BOTTOM
  1073.   INC DH
  1074.   CALL MOVCUR
  1075.   ADD CURPTR,80     ;BECAUSE OF TOPLEF CHANGE
  1076.   JMP NEWSCRN
  1077.  
  1078. JMPWATE:
  1079.   JMP WATE
  1080.  
  1081. ;DOWN ARROW
  1082. CURDN:
  1083.   CALL SCRLOCK
  1084.   JNZ DOWN        ;IF SCROLLLOCK IS ON
  1085.   MOV AX,TOPLEF
  1086.   CMP AX,LTOPLEF
  1087.   JC CURDN3        ;IF NOT AT LAST SCREEN OF FILE
  1088.   MOV CL,4
  1089.   SHL AX,CL
  1090.   ADD AX,CURPTR
  1091.   MOV BX,FILENDO
  1092.   NEG AX
  1093.   ADD BX,AX
  1094.   CMP BX,80
  1095.   JC JMPWATE
  1096. CURDN3: 
  1097.   MOV DX,CURLOC
  1098.   CMP DH,24
  1099.   JE CURDN2        ;IF ON BOTTOM LINE
  1100.   INC DH
  1101.   CALL MOVCUR
  1102.   ADD CURPTR,80
  1103.   JMP NEWSCRN
  1104.   
  1105. CURDN2:
  1106.   MOV AX,TOPLEF
  1107.   ADD AX,5
  1108.   MOV TOPLEF,AX
  1109.   CMP AX,LTOPLEF
  1110.   IF NC CALL CUREND    ;IF AT LAST SCREEN OF FILE
  1111.   JMP NEWSCRN        ;DON't need to increment curptr
  1112.   
  1113. ;SCROLLLOCK ON
  1114. DOWN:
  1115.   MOV AX,TOPLEF
  1116.   CMP AX,LTOPLEF
  1117.   JNC JMPWATE        ;IF AT END OF FILE
  1118.   ADD TOPLEF,5        ;80 SHIFTED RIGHT
  1119.   MOV DX,CURLOC
  1120.   CMP DH,1
  1121.   JE DOWNEND        ;IF CURSOR IS ON TOP LINE
  1122.   DEC DH
  1123.   CALL MOVCUR
  1124.   SUB CURPTR,80     ;BECAUSE OF TOPLEF CHANGE
  1125. DOWNEND:
  1126.   JMP NEWSCRN
  1127.  
  1128. ;***
  1129.  
  1130. ;JUMP TO INPUT HEX ADDRESS
  1131. JUMP:
  1132.   MOV SI,OFFSET JUMP?
  1133.   CALL TOP
  1134.   MOV BP,96        ;FOR SCREEN LOCATION IN GETSTR
  1135.   CALL GETSTR        ;GET INPUT
  1136.   IF S JMP FINDXIT    ;IF NO INPUT
  1137.   MOV SI,DI        ;JUST AFTER LAST INPUT CHAR ON SCREEN
  1138.   SUB DI,DI        ;FOR OFFSET ADDRESS
  1139.   SUB BX,BX        ;FOR SEGMENT ADDRESS
  1140.   MOV DX,0004        ;DH FOR CL & DL FOR LOOP
  1141. ;GET OFFSET ADDRESS
  1142. L1:
  1143.   SUB SI,2
  1144.   CMP SI,96        ;INPUT SCREEN LOCATION
  1145.   JL  >L2        ;IF NO GOOD INPUT
  1146.   MOV AL,ES:[SI]
  1147.   CALL HEX2BIN        ;CONVERT TO BINARY
  1148.   JC  L1        ;IF NOT HEXADECIMAL
  1149.   MOV CL,DH
  1150.   ADD DH,4        ;TO ROL AX TO NEXT NIBBLE TO LEFT
  1151.   SUB AH,AH        ;ROL CHANGES IT
  1152.   ROL AX,CL
  1153.   OR  DI,AX        ;TA DAA!
  1154.   DEC DL
  1155.   JNZ L1
  1156. ;GET SEGMENT ADDRESS (IF FIFTH CHAR NOT INPUT,IT's 0)
  1157.   SUB SI,2
  1158.   MOV AL,ES:[SI]
  1159.   CALL HEX2BIN
  1160.   JC >L2
  1161.   MOV BL,AL
  1162.   JMP SHORT >L21
  1163. L2:
  1164.   CMP DI,BEGIN
  1165.   IF C MOV DI,BEGIN
  1166. L21:
  1167.   SUB DI,BEGIN
  1168.   SBB BX,0
  1169.   CMP BX,FILSIZS
  1170.   JC >L4
  1171.   JG >L3
  1172.   CMP DI,FILSIZO
  1173.   JC >L4
  1174. L3:
  1175.   MOV DI,FILSIZO
  1176.   MOV BX,FILSIZS
  1177. L4:
  1178. ITSEXE:
  1179.   MOV SAVES,ES
  1180.   MOV BP,FTOPLEF
  1181.   MOV AX,DI
  1182.   MOV DX,BX
  1183.   MOV CL,4
  1184.   ROR BX,CL
  1185.   JMP THERE
  1186.  
  1187. FIND:    
  1188.   MOV SI,OFFSET FIND?
  1189.   CALL TOP
  1190.   MOV BP,90        ;SCREEN ADDRESS OFFSET
  1191.   CALL GETSTR        ;GET INPUT & STRING COUNT-1 IN STRCNT
  1192.   IF S JMP FINDXIT    ;IF NO INPUT OR ESC PRESSED
  1193.   MOV SI,90
  1194.   MOV DI,OFFSET FINDSTR
  1195. ;CHECK TO SEE IF ASCII STRING
  1196.   CMP B ES:[SI],027    ;'
  1197.   JZ FINDASCII
  1198.   CMP B ES:[SI],022    ;"
  1199.   JZ FINDASCII
  1200.  
  1201. ;CONVERT ASCII HEX TO BINARY & STORE IT IN FINDSTR
  1202.   MOV STRCNT,0        ;RE-COMPUTE IT
  1203.   MOV CX,18
  1204. CONVHEX:
  1205.   MOV AL,ES:[SI]
  1206.   CMP AL,' '
  1207.   JZ SKIP
  1208.   CMP AL,','
  1209.   JZ SKIP
  1210.   CALL HEX2BIN        ;CONVERTS ASCII HEX CHAR TO BINARY
  1211.   IF C JMP FINDXIT    ;IF NOT ASCII HEX INPUT
  1212.   PUSH CX
  1213.   MOV CL,4
  1214.   SHL AL,CL
  1215.   POP CX
  1216.   MOV DS:[DI],AL
  1217.   ADD SI,2        ;TO NEXT ASCII HEX INPUT
  1218.   MOV AL,ES:[SI]
  1219.   CALL HEX2BIN
  1220.   JNC PART2
  1221.   CMP AL,' '
  1222.   JZ >L1
  1223.   CMP AL,','
  1224.   JZ >L1
  1225.   JMP FINDXIT
  1226. L1:
  1227.   PUSH CX
  1228.   MOV CL,4
  1229.   MOV AL,DS:[DI]
  1230.   SHR AL,CL        ;PUT FIRST DIGIT BACK AT RIGHT SIDE
  1231.   POP CX
  1232.   MOV DS:[DI],AL
  1233.   JMP SHORT PART1
  1234. PART2:
  1235.   OR DS:[DI],AL
  1236. PART1:
  1237.   INC DI
  1238.   INC STRCNT
  1239. SKIP:
  1240.   ADD SI,2
  1241.   LOOP CONVHEX
  1242.   DEC STRCNT
  1243.   JMP SHORT REPEAT
  1244.  
  1245. FINDASCII:
  1246.   ADD SI,2        ;DON't look for the ' or "
  1247.   DEC STRCNT
  1248.   MOV CX,17
  1249. ;STORE STRING IN FINDSTR
  1250. STORSTR:
  1251.   MOV AL,ES:[SI]
  1252.   CMP AL,ES:[90]    ;' or "
  1253.   JNZ >L4
  1254.   DEC STRCNT
  1255.   MOV AL,' '
  1256. L4:
  1257.   MOV DS:[DI],AL
  1258.   INC DI
  1259.   ADD SI,2
  1260.   LOOP STORSTR
  1261.  
  1262. REPEAT:
  1263.   MOV BP,TOPLEF
  1264.   MOV SI,OFFSET SEARCH    ;'SEARCHING...'
  1265.   CALL TOP
  1266. ;SEARCH FOR STRING
  1267.   MOV DI,BP        ;EITHER TOPLEF OR FTOPLEF
  1268.   MOV BX,DI        ;FOR ABSOLUTE SEGMENT ADDR
  1269.   AND BX,0F000
  1270.   MOV CL,4
  1271.   SHL DI,CL
  1272.   MOV AX,CURPTR
  1273.   INC AX        ;TO START LOOKING 1 BYTE BEYOND CURRENT CURSOR LOCATION
  1274.   ADD DI,AX        ;TO GET ABSOLUTE OFFSET ADDR
  1275.   IF C ADD BX,01000
  1276.   MOV BP,BX        ;FOR CURRENT ABSOLUTE SEG ADDR
  1277.   MOV SAVES,ES
  1278.   MOV ES,BP        ;BEGINNING OF FILE SEGMENT
  1279.   ROL BX,CL        ;MOVE LEFT NIBBLE TO RIGHT (CL IS ALREADY 4)
  1280.   MOV CX,FILENDO    ;FOR REPNZ SCASB,BELOW (MAY BE 0,SEE BELOW)
  1281.   INC CX        ;BECAUSE CURPTR WAS INCREMENTED
  1282.   NEG BX
  1283.   ADD BX,FILENDS    ;TO GET FILENDS - CURRENT SEGMENT IN BX
  1284. FINDLOOP: 
  1285.   IF NZ MOV CX,0FFFF    ;IF CURSOR NOT IN SAME ABSOLUTE SEGEMENT AS FILEND
  1286.   SUB CX,DI        ;TO GET EITHER FILENDO OR 0FFFF - CURRENT ABSOLUTE OFFSET
  1287. FINDLP2:
  1288.   OR CX,CX
  1289.   JZ QUITFIND
  1290.   MOV SI,OFFSET FINDSTR ;ADDRESS OF STRING TO FIND
  1291.   MOV AL,[SI]        ;FIRST CHAR
  1292.   REPNZ SCASB        ;REPEAT UNTIL Z=TRUE OR CX=0
  1293.   JZ STRCHK        ;IF FIRST CHAR FOUND
  1294.   OR BX,BX        ;NO. OF REMAINING SEGMENTS TO SEARCH
  1295.   JNZ NEWSEG
  1296. QUITFIND:
  1297.   JMP NOTFOUND
  1298. NEWSEG:
  1299.   SCASB         ;BECAUSE DI ONLY GOT TO 0FFFF, NOT 0
  1300.   JZ STRCHK
  1301.   ADD BP,01000
  1302.   MOV ES,BP        ;INCREMENTS ABSOLUTE SEGMENT
  1303.   MOV CX,FILENDO
  1304.   INC CX
  1305.   DEC BX
  1306.   JMP SHORT FINDLOOP
  1307.  
  1308. ;CALLED ONLY IN EXTREMELY RARE CIRCUMSTANCE, BUT I GUESS IT's necessary...
  1309. CHNGSEG:
  1310.   OR BX,BX
  1311.   JZ NOTFOUND
  1312.   PUSH BP,ES
  1313.   ADD BP,01000
  1314.   MOV ES,BP
  1315.   REPZ CMPSB
  1316.   POP ES,BP
  1317.   JMP SHORT RETCHKLP
  1318.  
  1319. STRCHK:
  1320.   MOV AX,DI        ;SAVE IT
  1321.   MOV DX,CX        ;DITTO
  1322.   MOV CX,STRCNT     ;STRING LENGTH-1 FROM GETSTR SUBROUTINE
  1323.   OR CX,CX
  1324.   JZ FOUND        ;IF ONLY SEARCHING FOR 1 CHAR
  1325.   INC SI        ;POINT TO REMAINDER OF STRING
  1326. CHKLP:
  1327.   OR DI,DI
  1328.   JZ CHNGSEG        ;IF SEARCHING PAST END OF SEGMENT
  1329.   CMPSB         ;COMPARE STRINGS (REPEAT UNTIL Z=FALSE OR CX=0)
  1330.   LOOPZ CHKLP
  1331. RETCHKLP:
  1332.   MOV CX,DX
  1333.   MOV DI,AX
  1334.   JNZ FINDLP2        ;IF STRING NOT FOUND
  1335.  
  1336. ;JUMP TO ADDRESS
  1337. FOUND:
  1338.   MOV DX,BP        ;CURRENT SEGMENT
  1339.   MOV CL,4
  1340.   ROL DX,CL
  1341.   OR DI,DI
  1342.   JNZ SAMESEG
  1343.   DEC DX
  1344.   SUB BP,01000
  1345. SAMESEG:
  1346.   DEC DI        ;OFFSET ADDR
  1347.   MOV AX,DI
  1348.   SUB AX,BUFOFF
  1349.   SBB DX,BUFSEG
  1350.   SUB AX,HEADSIZ
  1351.   SBB DX,0
  1352.   MOV BX,BP        ;SEG ADDR
  1353.   SUB BP,BP        ;USED LATER (JUMP ALSO USES BP LATER)
  1354.  
  1355. THERE:
  1356.   CMP DX,010        ;SEGMENT ADDRESS
  1357.   JNC NOTFOUND        ;AN IMPOSSIBILITY...
  1358.   MOV CX,80
  1359.   DIV CX        ;REMAINDER IS IN DX (& DL = COLUMN)
  1360.   MOV CURPTR,DX     ;COLUMN (DH=0)
  1361.   SUB DI,DX        ;TO GET TOPLEF
  1362.   IF C SUB BX,01000
  1363.   MOV CL,4
  1364.   SHR DI,CL
  1365.   ADD DI,BX
  1366.   ADD DI,BP
  1367.   MOV TOPLEF,DI     ;TA-DAA!
  1368.   MOV DH,1        ;PUT CURSOR ON FIRST ROW
  1369.   MOV CURLOC,DX     ;FOR MOVCUR
  1370. ;CLEAR MESSAGE & EXIT
  1371. NOTFOUND:
  1372.   MOV ES,SAVES
  1373. FINDXIT: 
  1374.   CALL WRITEBLANKS
  1375.   MOV DX,CURLOC
  1376.   CALL MOVCUR
  1377.   MOV AH,1        ;FUNCTION TO CHANGE CURSOR SHAPE
  1378.   MOV CX,7        ;TOP & BOTTOM ROW OF CURSOR
  1379.   INT 010
  1380.   JMP NEWSCRN
  1381.  
  1382. ;LOOK FOR STRING AGAIN
  1383. AGAIN:    
  1384.   CALL HIDECUR
  1385.   JMP SHORT REPEAT
  1386.  
  1387. NOTHERE:
  1388.   MOV SI,081
  1389.   MOV AL,[080]
  1390.   SUB AH,AH
  1391.   ADD SI,AX
  1392.   MOV B[SI],'$'
  1393.   MOV DX,081
  1394.   MOV AH,9
  1395.   INT 021
  1396.   MOV DX,OFFSET NOFILE
  1397.   MOV AH,9
  1398.   INT 021
  1399.   MOV AX,04C00
  1400.   INT 021
  1401.  
  1402. WRITE:
  1403.   MOV AX,04200        ;FUNCTION TO MOVE FILE POINTER TO BEGINNING OF FILE
  1404.   MOV BX,HANDLE
  1405.   SUB CX,CX
  1406.   SUB DX,DX
  1407.   INT 021
  1408. ;WRITE FILE TO DISK
  1409.   MOV BP,FILSIZS
  1410.   MOV DX,FILEBEG
  1411.   MOV AX,FILSIZO
  1412. WRITELP:
  1413.   MOV TEMPFIL,AX
  1414.   MOV CX,0FFF0
  1415.   OR BP,BP
  1416.   IF Z MOV CX,AX
  1417.   MOV DS,DX
  1418.   PUSH DX
  1419.   SUB DX,DX
  1420.   MOV AH,040        ;FUNCTION TO WRITE FILE
  1421.   INT 021
  1422.   MOV DX,CS
  1423.   MOV DS,DX
  1424.   POP DX
  1425.   ADD DX,0FFF
  1426.   JC EXIT
  1427.   OR AX,AX
  1428.   JZ EXIT
  1429.   MOV AX,TEMPFIL
  1430.   SUB AX,0FFF0
  1431.   SBB BP,0
  1432.   JNS WRITELP
  1433.  
  1434. ;RETURN TO DOS
  1435. EXIT:    
  1436. ;RESTORE OLD CURSOR LOCATION
  1437.   MOV DX,OLDCUR    ;OLD CURSOR LOCATION
  1438.   MOV AH,1        ;FUNCTION TO SET CURSOR TYPE
  1439.   MOV CX,CURSHPE    ;STARTING & ENDING LINE OF CURSOR
  1440.   INT 010
  1441.   CALL MOVCUR
  1442. ;BLANK BORDER
  1443.   MOV AH,0B
  1444.   SUB BX,BX
  1445.   INT 010
  1446. ;RESTORE OLD SCREEN
  1447.   SUB DI,DI
  1448.   MOV SI,OLDSCR
  1449.   MOV CX,2000
  1450.   REP MOVSW
  1451.  
  1452.   MOV AX,04C00        ;TERMINATE WITH RETURN CODE
  1453.   INT 021        ;RETURN TO DOS
  1454.  
  1455. ;******SUBROUTINES******
  1456.  
  1457. DISPLTOP:
  1458.   MOV SI,OFFSET TOPLINE
  1459.   SUB DI,DI        ;LOCATION ON SCREEN
  1460.   MOV CX,41        ;FOR COUNT
  1461.   MOV AH,TOPATTRIB
  1462.   CMP MODE,7        ;MONOCHROME
  1463.   IF Z MOV AH,070    ;REVERSE IMAGE
  1464.   CALL MOVIT        ;MOVE [SI] INTO [DI] & INC DI CX TIMES
  1465.   MOV AL,' '
  1466.   MOV CX,24
  1467.   REP STOSW
  1468.   MOV SI,OFFSET HELP?
  1469.   MOV CX,15
  1470.   CALL MOVIT
  1471.   RET
  1472.  
  1473. ;PUT 'FIND:' or 'JUMP TO:' on top line of screen
  1474. TOP:
  1475.   MOV CX,13
  1476.   MOV DI,78
  1477.   MOV AH,TOPATTRIB
  1478.   CMP MODE,7
  1479.   IF Z MOV AH,070
  1480.   CALL MOVIT
  1481.   MOV AL,' '
  1482.   MOV CX,12
  1483.   REP STOSW
  1484.   RET
  1485.  
  1486. WRITEBLANKS:
  1487.   MOV AL,' '
  1488.   MOV CX,25
  1489.   MOV DI,78
  1490. BLANKLP:
  1491.   STOSB
  1492.   INC DI
  1493.   LOOP BLANKLP
  1494.   RET
  1495.  
  1496. ;TO MOVE A STRING AT [DI] TO [SI] (ATTRIBUTE IN AH)
  1497. MOVIT:    
  1498.   LODSB
  1499.   STOSW
  1500.   LOOP MOVIT
  1501.   RET
  1502.  
  1503. MOVIT2:
  1504.   LODSB
  1505.   CMP AL,07F
  1506.   JNC SHODOT
  1507.   CMP AL,020
  1508.   JNC SHOLET
  1509. SHODOT:
  1510.   MOV AL,'.'
  1511. SHOLET:
  1512.   STOSW
  1513.   LOOP MOVIT2
  1514.   RET
  1515.  
  1516. ;TO PUT CURSOR AT END OF FILE
  1517. CUREND: 
  1518.   MOV DX,TOPLEF
  1519.   MOV CL,4
  1520.   SHL DX,CL
  1521.   MOV AX,FILENDO
  1522.   NEG DX
  1523.   ADD AX,DX
  1524.   MOV CURPTR,AX
  1525.   MOV CL,80
  1526.   DIV CL
  1527.   INC AL
  1528.   MOV DH,AL        ;QUOTIENT (ANSWER) (FOR ROW)
  1529.   MOV DL,AH        ;REMAINDER (FOR COLUMN)
  1530.   JMP SHORT MOVCUR
  1531.  
  1532. ;PUT ROW IN DH & COL IN DL
  1533. GETCUR: 
  1534.   MOV AH,3
  1535.   SUB BH,BH
  1536.   INT 010
  1537.   MOV CURLOC,DX
  1538.   RET
  1539.  
  1540. ;SAVE CURSOR LOCATION
  1541. HIDECUR:
  1542.   MOV DX,01900        ;ROW 25,COL 0
  1543.   JMP SHORT MOVCUR2
  1544.   
  1545. ;MOVE CURSOR TO ROW IN DH & COL IN DL
  1546. MOVCUR: 
  1547.   MOV CURLOC,DX
  1548. MOVCUR2:
  1549.   MOV AH,2
  1550.   SUB BH,BH
  1551.   INT 010
  1552.   RET
  1553.  
  1554. ;TO JUMP TO A SUBROUTINE (SEMI-TRICK)
  1555. CASE:    
  1556.   POP BX        ;RET ADDRESS
  1557.   MOV CL,[BX]        ;NUMBER OF COMPARISONS TO MAKE
  1558.   SUB CH,CH
  1559. CASLOP: 
  1560.   INC BX        ;TO A DB
  1561.   CMP AL,[BX]
  1562.   JE GO
  1563.   ADD BX,2        ;TO A DW
  1564.   LOOP CASLOP
  1565. GO:
  1566.   INC BX        ;TO A DW
  1567.   JMP [BX]
  1568.  
  1569. LCA:
  1570. ;TO CHANGE BINARY TO HEX
  1571. BIN2HEXW:
  1572.   CALL SHOWORD
  1573.   MOV DS,TOPLEF
  1574.   LODSW
  1575. BIN2HEXW2:
  1576.   MOV CH,4
  1577.   MOV BX,AX
  1578.   JMP SHORT BIN2HEXSKP
  1579. LCD:
  1580. BIN2HEXB:
  1581.   CALL SHOBYTE
  1582.   MOV DS,TOPLEF
  1583.   LODSB
  1584.   MOV CH,2
  1585.   MOV BH,AL
  1586. BIN2HEXSKP:
  1587.   PUSH CS
  1588.   POP DS
  1589. BIN2HEX:
  1590.   MOV CL,4
  1591. BIN2HEXLP:
  1592.   ROL BX,CL        ;MOVE LEFT BYTE TO RIGHT SIDE
  1593.   MOV AL,BL        ;THIS IS NECESSARY
  1594.   AND AL,0F        ;CLEAR LEFT BYTE
  1595.   ADD AL,'0'
  1596.   CMP AL,'9'
  1597.   IF A ADD AL,7
  1598.   STOSB
  1599.   INC DI
  1600.   DEC CH
  1601.   JNZ BIN2HEXLP
  1602.   RET
  1603.  
  1604. ;CONVERT AL FROM HEX TO BINARY
  1605. HEX2BIN:
  1606.   CMP AL,'0'
  1607.   JB BADHEX
  1608.   CMP AL,':'
  1609.   JB HEX2        ;IF NUMBER
  1610.   AND AL,0DFH        ;MAKE LETTERS UPPERCASE
  1611.   CMP AL,'A'
  1612.   JB BADHEX
  1613.   CMP AL,'F'
  1614.   JA BADHEX
  1615.   SUB AL,7
  1616. HEX2:
  1617.   SUB AL,'0'
  1618.   CLC 
  1619.   RET
  1620. BADHEX: 
  1621.   STC
  1622.   RET
  1623.  
  1624. ;MOVE CURSOR LEFT
  1625. LFTCUR: 
  1626.   MOV DX,CURLOC
  1627.   CMP DX,0100
  1628.   JE LFTTOP        ;IF AT TOP LEFT OF SCREEN
  1629.   DEC CURPTR
  1630.   OR DL,DL
  1631.   JE PREVLIN
  1632.   DEC DL
  1633.   JMP SHORT LFTMOV
  1634. PREVLIN:
  1635.   DEC DH
  1636.   MOV DL,79
  1637. LFTMOV: 
  1638.   CALL MOVCUR
  1639.   CLC
  1640. LFTXIT: 
  1641.   RET
  1642.  
  1643. LFTTOP: 
  1644.   MOV AX,TOPLEF
  1645.   CMP AX,FTOPLEF
  1646.   JE LFTXIT        ;IF AT BEGINNING OF FILE
  1647.   MOV DL,79
  1648.   CALL MOVCUR
  1649.   SUB TOPLEF,5        ;80D SHIFTED RIGHT
  1650.   ADD CURPTR,79     ;BECAUSE OF TOPLEF CHANGE
  1651.   STC
  1652.   RET
  1653.  
  1654. ;MOVE CURSOR RIGHT
  1655. RTCUR:    
  1656.   MOV AX,TOPLEF
  1657.   CMP AX,LTOPLEF
  1658.   JC RTCUR2        ;IF NOT AT LAST SCREEN
  1659.   MOV BX,AX
  1660.   MOV CL,4
  1661.   ROL BX,CL
  1662.   AND BX,0F
  1663.   SHL AX,CL
  1664.   ADD AX,CURPTR
  1665.   IF C INC BX
  1666.   CMP BX,FILENDS
  1667.   JC RTCUR2        ;IF CURRENT SEGMENT LESS THAN FILEND SEGMENT
  1668.   CMP AX,FILENDO
  1669.   JNC RTEXIT        ;IF CURSOR WOULD GO BEYOND FILE END
  1670. RTCUR2: 
  1671.   INC CURPTR
  1672.   MOV DX,CURLOC
  1673.   CMP DL,79
  1674.   JE NEXLIN
  1675.   INC DL
  1676.   JMP SHORT RTMOV
  1677. NEXLIN: 
  1678.   CMP DH,24
  1679.   JE RTBOT
  1680.   INC DH
  1681.   SUB DL,DL
  1682. RTMOV:    
  1683.   CALL MOVCUR
  1684. RTEXIT: 
  1685.   CLC
  1686.   RET
  1687.   
  1688. RTBOT:    
  1689.   CMP AX,LTOPLEF
  1690.   JNC RTEXIT
  1691.   SUB DL,DL
  1692.   CALL MOVCUR
  1693.   ADD TOPLEF,5
  1694.   SUB CURPTR,80     ;BECAUSE OF TOPLEF CHANGE
  1695.   STC
  1696.   RET
  1697.  
  1698. ;CHECK SCROLLLOCK ON OR OFF
  1699. SCRLOCK:
  1700.   PUSH ES
  1701.   SUB AX,AX
  1702.   MOV ES,AX
  1703.   TEST B ES:[0417],010
  1704.   POP ES
  1705.   RET
  1706.  
  1707. ;GET STRING TO SEARCH FOR
  1708. GETSTR: 
  1709.   MOV DX,BP
  1710.   SHR DX,1
  1711.   CALL MOVCUR2
  1712.   MOV AH,1        ;FUNCTION TO CHANGE CURSOR SHAPE
  1713.   MOV CX,0406        ;TOP & BOTTOM ROW OF CURSOR
  1714.   INT 010
  1715.   SUB DX,DX        ;FOR COUNT IN CMPSB, BELOW
  1716.   MOV DI,BP
  1717. CHKSTR: 
  1718.   SUB AH,AH        ;READ KEYBOARD FUNCTION
  1719.   INT 016
  1720.   CMP AH,14        ;BACKSPACE KEY
  1721.   JE ERASTR
  1722.   CMP AX,04B00        ;LEFT ARROW KEY
  1723.   JE ERASTR
  1724.   CMP AL,8        ;^H
  1725.   JE ERASTR
  1726.   CMP AL,0D        ;ENTER KEY
  1727.   JE XITSTR
  1728.   CMP AL,01B        ;ESC
  1729.   JNZ NOTESC
  1730.   SUB DX,DX        ;AS A FLAG (TO SET SIGN FLAG)
  1731.   JMP SHORT XITSTR
  1732. ;ERASE CHAR
  1733. ERASTR: 
  1734.   CMP DI,BP
  1735.   JE CHKSTR        ;DON'T ERASE IF AT BEGINNING OF INPUT LOCATION
  1736.   DEC DI
  1737.   DEC DI
  1738.   PUSH DX
  1739.   MOV DX,DI
  1740.   SHR DX,1
  1741.   CALL MOVCUR2
  1742.   POP DX
  1743.   DEC DX
  1744.   MOV AH,TOPATTRIB
  1745.   MOV AL,' '
  1746.   ES MOV W[DI],AX
  1747.   CMP MODE,7
  1748.   IF Z ES MOV B[DI+1],070
  1749.   JMP SHORT CHKSTR
  1750. NOTESC:
  1751.   CMP AL,' '
  1752.   JC CHKSTR        ;DON'T ACCEPT ANY OTHER ^CHARS
  1753. ;PUT CHAR ON SCREEN
  1754. SHOSTR: 
  1755.   CMP DI,126        ;LAST INPUT SPACE
  1756.   JE XITSTR        ;EXIT
  1757.   STOSB
  1758.   INC DI
  1759.   PUSH DX
  1760.   MOV DX,DI
  1761.   SHR DX,1
  1762.   CALL MOVCUR2
  1763.   POP DX
  1764.   INC DX
  1765.   JMP SHORT CHKSTR
  1766. XITSTR: 
  1767.   DEC DX
  1768.   MOV STRCNT,DX
  1769.   RET
  1770.  
  1771. MENWRT: 
  1772.   MOV AH,SCRNATTRIB
  1773.   CMP MODE,7
  1774.   IF Z MOV AH,7
  1775.   SUB DI,DI
  1776.   MOV AL,' '
  1777.   MOV CX,2
  1778.   REP STOSW
  1779.   MOV DX,25        ;ROWS
  1780. MENLP0: 
  1781.   MOV CX,80        ;COLUMNS
  1782. MENLP:    
  1783.   LODSB
  1784.   OR AL,AL
  1785.   JE MENSK
  1786.   STOSW
  1787.   LOOP MENLP
  1788. MENSK:    
  1789.   REP STOSW
  1790.   OR SI,SI
  1791.   IF Z ADD DI,160
  1792.   DEC DX
  1793.   JNZ MENLP0
  1794.   MOV AL,179        ;│
  1795.   MOV DI,160
  1796.   MOV CX,23
  1797. SIDELINES:
  1798.   STOSB
  1799.   ADD DI,157
  1800.   STOSB
  1801.   INC DI
  1802.   LOOP SIDELINES
  1803.   MOV B ES:[0],218    ;┌
  1804.   MOV B ES:[3840],192    ;└
  1805.   MOV B ES:[158],191    ;┐
  1806.   MOV B ES:[3998],217    ;┘
  1807.   SUB AH,AH
  1808.   INT 016H        ;READ KEYBOARD
  1809. RTN:
  1810.   RET
  1811.  
  1812. ;********DISASSEMBLE SUBROUTINES
  1813.  
  1814. L00:
  1815.   CALL GETBYTE2
  1816.   MOV BX,OFFSET REGB
  1817.   MOV B[BW],'B'
  1818.   CALL MODRMBITS
  1819.   MOV AL,','
  1820.   STOSB
  1821.   INC DI
  1822.   MOV BX,OFFSET REGB
  1823.   JMP NBITS
  1824.  
  1825. L01:
  1826.   CALL GETBYTE2
  1827.   MOV BX,OFFSET REGW
  1828.   MOV B[BW],'W'
  1829.   CALL MODRMBITS
  1830.   MOV AL,','
  1831.   STOSB
  1832.   INC DI
  1833.   MOV BX,OFFSET REGW
  1834.   JMP NBITS
  1835.  
  1836. L02:
  1837.   CALL GETBYTE2
  1838.   MOV BX,OFFSET REGB
  1839.   CALL NBITS
  1840.   MOV AL,','
  1841.   STOSB
  1842.   INC DI
  1843.   MOV BX,OFFSET REGB
  1844.   MOV B[BW],'B'
  1845.   JMP MODRMBITS
  1846.  
  1847. L03:
  1848.   CALL GETBYTE2
  1849.   MOV BX,OFFSET REGW
  1850.   CALL NBITS
  1851.   MOV AL,','
  1852.   STOSB
  1853.   INC DI
  1854.   MOV BX,OFFSET REGW
  1855.   MOV B[BW],'W'
  1856.   JMP MODRMBITS
  1857.  
  1858. L04:
  1859.   MOV AX,'LA'
  1860.   CALL L045
  1861.   JMP BIN2HEXB
  1862.  
  1863. L05:
  1864.   MOV AX,'XA'
  1865.   CALL L045
  1866.   JMP BIN2HEXW
  1867.  
  1868. L045:
  1869.   STOSB
  1870.   INC DI
  1871.   XCHG AL,AH
  1872.   STOSB
  1873.   INC DI
  1874.   MOV AL,','
  1875.   STOSB
  1876.   INC DI
  1877.   RET
  1878.  
  1879. L06:
  1880.   MOV AX,'SE'
  1881.   JMP SHORT AXTODI
  1882.  
  1883. L0E:
  1884.   MOV AX,'SC'
  1885.   JMP SHORT AXTODI
  1886.  
  1887. L16:
  1888.   MOV AX,'SS'
  1889.   JMP SHORT AXTODI
  1890.  
  1891. L1E:
  1892.   MOV AX,'SD'
  1893.   JMP SHORT AXTODI
  1894.  
  1895. L40:
  1896.   MOV AX,'XA'
  1897.   JMP SHORT AXTODI
  1898. L41:
  1899.   MOV AX,'XC'
  1900.   JMP SHORT AXTODI
  1901. L42:
  1902.   MOV AX,'XD'
  1903.   JMP SHORT AXTODI
  1904. L43:
  1905.   MOV AX,'XB'
  1906.   JMP SHORT AXTODI
  1907. L44:
  1908.   MOV AX,'PS'
  1909.   JMP SHORT AXTODI
  1910. L45:
  1911.   MOV AX,'PB'
  1912.   JMP SHORT AXTODI
  1913. L46:
  1914.   MOV AX,'IS'
  1915.   JMP SHORT AXTODI
  1916. L47:
  1917.   MOV AX,'ID'
  1918. AXTODI:
  1919.   STOSB
  1920.   INC DI
  1921.   XCHG AL,AH
  1922.   STOSB
  1923.   INC DI
  1924.   RET
  1925.  
  1926. L70:
  1927.   MOV DS,TOPLEF
  1928.   LODSB
  1929.   CBW
  1930.   MOV DX,2
  1931.   CALL RELATIVE
  1932.   JMP SHOBYTE
  1933.  
  1934. L80:
  1935.   SUB BP,BP        ;TO INDEX TO IMMED,SHIFT,GRP1,OR GRP2
  1936.   MOV BX,OFFSET REGB
  1937.   MOV SAVEBX,BX
  1938.   MOV B[BW],'B'
  1939.   CALL EIGHTX
  1940.   MOV AL,','
  1941.   STOSB
  1942.   INC DI
  1943.   JMP BIN2HEXB
  1944.  
  1945. L81:
  1946.   SUB BP,BP
  1947.   MOV BX,OFFSET REGW
  1948.   MOV SAVEBX,BX
  1949.   MOV B[BW],'W'
  1950.   CALL EIGHTX
  1951.   MOV AL,','
  1952.   STOSB
  1953.   INC DI
  1954.   JMP BIN2HEXW
  1955.  
  1956. L83:
  1957.   SUB BP,BP
  1958.   MOV BX,OFFSET REGW
  1959.   MOV SAVEBX,BX
  1960.   MOV B[BW],'W'
  1961.   CALL EIGHTX
  1962.   MOV AL,','
  1963.   STOSB
  1964.   INC DI
  1965.   MOV AL,'0'
  1966.   TEST B[SI],080
  1967.   IF NZ MOV AL,'F'
  1968.   STOSB
  1969.   INC DI
  1970.   STOSB
  1971.   INC DI
  1972.   JMP BIN2HEXB
  1973.  
  1974. EIGHTX:
  1975.   CALL GETBYTE2
  1976.   SUB DI,2        ;WRITE OVER BLANK
  1977.   MOV CL,3
  1978.   SHR AX,CL        ;LOOK AT R BITS
  1979.   AND AX,7        ;CLEAR ALL BUT LOW 3 BITS
  1980.   SHL AX,1        ;DOUBLE IT
  1981.   MOV BX,OFFSET ISGGPTRS
  1982.   ADD BX,BP
  1983.   MOV BX,[BX]
  1984.   ADD BX,AX
  1985.   PUSH SI
  1986.   MOV SI,[BX]        ;POINT TO STRING
  1987. ISGGLP:
  1988.   LODSB
  1989.   STOSB
  1990.   INC DI
  1991.   CMP AL,' '
  1992.   JNZ ISGGLP
  1993.   POP SI
  1994.   MOV BX,SAVEBX
  1995.   JMP MODRMBITS
  1996.  
  1997. L8C:
  1998.   MOV BX,OFFSET REGW
  1999.   MOV B[BW],'W'
  2000.   CALL GETBYTE2
  2001.   CALL MODRMBITS
  2002.   MOV AL,','
  2003.   STOSB
  2004.   INC DI
  2005.   PUSH SI
  2006.   MOV SI,OFFSET SEGS
  2007.   MOV CL,3
  2008.   MOV AL,BYTE2
  2009.   SHR AX,CL
  2010.   AND AX,7
  2011.   SHL AX,1
  2012.   ADD SI,AX
  2013.   MOVSB
  2014.   INC DI
  2015.   MOVSB
  2016.   INC DI
  2017.   POP SI
  2018.   RET
  2019.  
  2020. L8E:
  2021.   CALL GETBYTE2
  2022.   PUSH SI
  2023.   MOV SI,OFFSET SEGS
  2024.   MOV CL,3
  2025.   SHR AX,CL
  2026.   AND AX,7
  2027.   SHL AX,1
  2028.   ADD SI,AX
  2029.   MOVSB
  2030.   INC DI
  2031.   MOVSB
  2032.   INC DI
  2033.   POP SI
  2034.   MOV AL,','
  2035.   STOSB
  2036.   INC DI
  2037. L8F:
  2038.   MOV BX,OFFSET REGW
  2039.   MOV B[BW],'W'
  2040.   JMP MODRMBITS
  2041.  
  2042. L91:
  2043.   CALL L41
  2044.   JMP SHORT L9X
  2045. L92:
  2046.   CALL L42
  2047.   JMP SHORT L9X
  2048. L93:
  2049.   CALL L43
  2050.   JMP SHORT L9X
  2051. L94:
  2052.   CALL L44
  2053.   JMP SHORT L9X
  2054. L95:
  2055.   CALL L45
  2056.   JMP SHORT L9X
  2057. L96:
  2058.   CALL L46
  2059.   JMP SHORT L9X
  2060. L97:
  2061.   CALL L47
  2062. L9X:
  2063.   MOV AL,','
  2064.   STOSB
  2065.   INC DI
  2066.   MOV AX,'XA'
  2067.   STOSB
  2068.   INC DI
  2069.   XCHG AL,AH
  2070.   STOSB
  2071.   INC DI
  2072.   RET
  2073.  
  2074. L9A:
  2075.   ADD SI,2
  2076.   CALL BIN2HEXW
  2077.   MOV AL,':'
  2078.   STOSB
  2079.   INC DI
  2080.   SUB SI,4
  2081.   CALL BIN2HEXW
  2082.   ADD SI,2
  2083.   RET
  2084.  
  2085. LA0:
  2086.   MOV AX,'LA'
  2087.   MOV B[BW],'B'
  2088.   JMP SHORT LA01
  2089. LA1:
  2090.   MOV AX,'XA'
  2091.   MOV B[BW],'W'
  2092. LA01:
  2093.   STOSB
  2094.   INC DI
  2095.   XCHG AH,AL
  2096.   STOSB
  2097.   INC DI
  2098.   MOV AL,','
  2099.   STOSB
  2100.   INC DI
  2101.   MOV AL,B[BW]
  2102.   STOSB
  2103.   INC DI
  2104.   MOV AL,'['
  2105.   STOSB
  2106.   INC DI
  2107.   CALL BIN2HEXW
  2108.   MOV AL,']'
  2109.   STOSB
  2110.   RET
  2111.  
  2112. LA2:
  2113.   MOV B[BW],'B'
  2114.   CALL LA23
  2115.   MOV AX,'LA'
  2116.   JMP SHORT LAX
  2117. LA3:
  2118.   MOV B[BW],'W'
  2119.   CALL LA23
  2120.   MOV AX,'XA'
  2121. LAX:
  2122.   STOSB
  2123.   INC DI
  2124.   XCHG AL,AH
  2125.   STOSB
  2126.   RET
  2127.  
  2128. LA23:
  2129.   MOV AL,B[BW]
  2130.   STOSB
  2131.   INC DI
  2132.   MOV AL,'['
  2133.   STOSB
  2134.   INC DI
  2135.   CALL BIN2HEXW
  2136.   MOV AL,']'
  2137.   STOSB
  2138.   INC DI
  2139.   MOV AL,','
  2140.   STOSB
  2141.   INC DI
  2142.   RET
  2143.  
  2144. LA4:
  2145.   SUB DI,2
  2146.   ES MOV B[DI],'B'
  2147.   RET
  2148.  
  2149. LA5:
  2150.   SUB DI,2
  2151.   ES MOV B[DI],'W'
  2152.   RET
  2153.  
  2154. LB0:
  2155.   MOV AX,'LA'
  2156.   JMP SHORT LBX
  2157. LB1:
  2158.   MOV AX,'LC'
  2159.   JMP SHORT LBX
  2160. LB2:
  2161.   MOV AX,'LD'
  2162.   JMP SHORT LBX
  2163. LB3:
  2164.   MOV AX,'LB'
  2165.   JMP SHORT LBX
  2166. LB4:
  2167.   MOV AX,'HA'
  2168.   JMP SHORT LBX
  2169. LB5:
  2170.   MOV AX,'HC'
  2171.   JMP SHORT LBX
  2172. LB6:
  2173.   MOV AX,'HD'
  2174.   JMP SHORT LBX
  2175. LB7:
  2176.   MOV AX,'HB'
  2177.   JMP SHORT LBX
  2178. LB8:
  2179.   MOV AX,'XA'
  2180.   JMP SHORT LBX2
  2181. LB9:
  2182.   MOV AX,'XC'
  2183.   JMP SHORT LBX2
  2184. LBA:
  2185.   MOV AX,'XD'
  2186.   JMP SHORT LBX2
  2187. LBB:
  2188.   MOV AX,'XB'
  2189.   JMP SHORT LBX2
  2190. LBC:
  2191.   MOV AX,'PS'
  2192.   JMP SHORT LBX2
  2193. LBD:
  2194.   MOV AX,'PB'
  2195.   JMP SHORT LBX2
  2196. LBE:
  2197.   MOV AX,'IS'
  2198.   JMP SHORT LBX2
  2199. LBF:
  2200.   MOV AX,'ID'
  2201.   JMP SHORT LBX2
  2202. LBX:
  2203.   STOSB
  2204.   INC DI
  2205.   XCHG AL,AH
  2206.   STOSB
  2207.   INC DI
  2208.   MOV AL,','
  2209.   STOSB
  2210.   INC DI
  2211.   JMP BIN2HEXB
  2212.  
  2213. LBX2:
  2214.   STOSB
  2215.   INC DI
  2216.   XCHG AL,AH
  2217.   STOSB
  2218.   INC DI
  2219.   MOV AL,','
  2220.   STOSB
  2221.   INC DI
  2222.   JMP BIN2HEXW
  2223.  
  2224. LC4:
  2225.   CALL GETBYTE2
  2226.   MOV BX,OFFSET REGW
  2227.   CALL NBITS
  2228.   MOV AL,','
  2229.   STOSB
  2230.   INC DI
  2231.   MOV BX,OFFSET REGW
  2232.   MOV B[BW],'W'
  2233.   JMP MODRMBITS
  2234.  
  2235. LC6:
  2236.   MOV BX,OFFSET REGB
  2237.   MOV B[BW],'B'
  2238.   CALL LC67
  2239.   JMP BIN2HEXB
  2240.  
  2241. LC7:
  2242.   MOV BX,OFFSET REGW
  2243.   MOV B[BW],'W'
  2244.   CALL LC67
  2245.   JMP BIN2HEXW
  2246.  
  2247. LC67:
  2248.   CALL GETBYTE2
  2249.   CALL MODRMBITS
  2250.   MOV AL,','
  2251.   STOSB
  2252.   INC DI
  2253.   RET
  2254.  
  2255. LD0:
  2256.   MOV BX,OFFSET REGB
  2257.   MOV B[BW],'B'
  2258.   JMP SHORT LDX
  2259. LD1:
  2260.   MOV BX,OFFSET REGW
  2261.   MOV B[BW],'W'
  2262. LDX:
  2263.   MOV SAVEBX,BX
  2264.   MOV BP,2        ;TO INDEX TO IMMED
  2265.   CALL EIGHTX
  2266.   MOV AL,','
  2267.   STOSB
  2268.   INC DI
  2269.   MOV AL,'1'
  2270.   STOSB
  2271.   RET
  2272.  
  2273. LD2:
  2274.   MOV BX,OFFSET REGB
  2275.   MOV B[BW],'B'
  2276.   JMP SHORT LDX2
  2277. LD3:
  2278.   MOV BX,OFFSET REGW
  2279.   MOV B[BW],'W'
  2280. LDX2:
  2281.   MOV SAVEBX,BX
  2282.   MOV BP,2        ;TO INDEX TO SHIFT
  2283.   CALL EIGHTX
  2284.   MOV AL,','
  2285.   STOSB
  2286.   INC DI
  2287.   MOV AX,'LC'
  2288.   STOSB
  2289.   INC DI
  2290.   XCHG AL,AH
  2291.   STOSB
  2292.   RET
  2293.  
  2294. LE4:
  2295.   MOV AX,'LA'
  2296.   JMP SHORT LE45
  2297. LE5:
  2298.   MOV AX,'XA'
  2299. LE45:
  2300.   STOSB
  2301.   INC DI
  2302.   XCHG AL,AH
  2303.   STOSB
  2304.   INC DI
  2305.   MOV AL,','
  2306.   STOSB
  2307.   INC DI
  2308.   JMP BIN2HEXB
  2309.  
  2310. LE6:
  2311.   CALL BIN2HEXB
  2312.   MOV AL,','
  2313.   STOSB
  2314.   INC DI
  2315.   MOV AX,'LA'
  2316.   JMP SHORT LE67
  2317. LE7:
  2318.   CALL BIN2HEXB
  2319.   MOV AL,','
  2320.   STOSB
  2321.   INC DI
  2322.   MOV AX,'XA'
  2323. LE67:
  2324.   STOSB
  2325.   INC DI
  2326.   XCHG AL,AH
  2327.   STOSB
  2328.   RET
  2329.  
  2330. LE8:
  2331.   MOV DS,TOPLEF
  2332.   LODSW
  2333.   MOV DX,3
  2334.   CALL RELATIVE
  2335.   JMP SHOWORD
  2336.  
  2337. LEB:
  2338.   MOV DS,TOPLEF
  2339.   LODSB
  2340.   CBW
  2341.   MOV DX,2
  2342.   CALL RELATIVE
  2343.   JMP SHOBYTE
  2344.  
  2345. LEC:
  2346.   MOV AX,'LA'
  2347.   JMP SHORT LECD
  2348. LED:
  2349.   MOV AX,'XA'
  2350. LECD:
  2351.   STOSB
  2352.   INC DI
  2353.   XCHG AL,AH
  2354.   STOSB
  2355.   INC DI
  2356.   MOV AL,','
  2357.   STOSB
  2358.   INC DI
  2359.   MOV AX,'XD'
  2360.   JMP SHORT LEEF
  2361.  
  2362. LEE:
  2363.   MOV AX,'XD'
  2364.   STOSB
  2365.   INC DI
  2366.   XCHG AL,AH
  2367.   STOSB
  2368.   INC DI
  2369.   MOV AL,','
  2370.   STOSB
  2371.   INC DI
  2372.   MOV AX,'LA'
  2373.   JMP SHORT LEEF
  2374. LEF:
  2375.   MOV AX,'XD'
  2376.   STOSB
  2377.   INC DI
  2378.   XCHG AL,AH
  2379.   STOSB
  2380.   INC DI
  2381.   MOV AL,','
  2382.   STOSB
  2383.   INC DI
  2384.   MOV AX,'XA'
  2385. LEEF:
  2386.   STOSB
  2387.   INC DI
  2388.   XCHG AL,AH
  2389.   STOSB
  2390.   JMP SHOBYTE
  2391.  
  2392. LF3:
  2393.   MOV DS,TOPLEF
  2394.   MOV AL,[SI]
  2395.   MOV CX,CS
  2396.   MOV DS,CX
  2397.   AND AL,0A6
  2398.   CMP AL,0A6
  2399.   JNZ LF2        ;IF NEXT BYTE ISN'T 0A6, 0A7, 0AE, OR 0AF
  2400.   SUB DI,2
  2401.   MOV AL,'E'
  2402.   STOSB
  2403.   ADD DI,3
  2404. LF2:
  2405.   CALL SHOBYTE
  2406.   JMP DIS2
  2407.  
  2408. LF6:
  2409.   MOV BX,OFFSET REGB
  2410.   MOV B[BW],'B'
  2411.   CALL LF67
  2412.   JMP BIN2HEXB
  2413.  
  2414. LF7:
  2415.   MOV BX,OFFSET REGW
  2416.   MOV B[BW],'W'
  2417.   CALL LF67
  2418.   JMP BIN2HEXW
  2419.  
  2420. LF67:
  2421.   CALL GETBYTE2
  2422.   SUB DI,2        ;WRITE OVER BLANK
  2423.   MOV CL,3
  2424.   SHR AX,CL        ;LOOK AT R BITS
  2425.   AND AX,7        ;CLEAR ALL BUT LOW 3 BITS
  2426.   CMP AL,1
  2427.   JNZ >L1
  2428. L2:
  2429.   POP CX        ;PREVIOUS RET ADDRESS
  2430.   RET            ;NO INSTRUCTION FOR THIS
  2431. L1:
  2432.   MOV SAVES,AX
  2433.   MOV BP,4        ;TO INDEX TO IMMED,SHIFT,GRP1,OR GRP2
  2434.   SHL AX,1        ;DOUBLE IT
  2435.   CALL LFX
  2436.   CALL MODRMBITS
  2437.   MOV AX,SAVES
  2438.   OR AX,AX
  2439.   JNZ L2        ;ONLY TEST INSTRUCTION NEEDS ANOTHER NUMBER
  2440.   MOV AL,','
  2441.   STOSB
  2442.   INC DI
  2443.   RET
  2444.  
  2445. LFE:
  2446.   MOV BP,6
  2447.   MOV BX,OFFSET REGB
  2448.   MOV B[BW],'B'
  2449.   CALL GETBYTE2
  2450.   SUB DI,2        ;WRITE OVER BLANK
  2451.   MOV CL,3
  2452.   SHR AX,CL        ;LOOK AT R BITS
  2453.   AND AX,7        ;CLEAR ALL BUT LOW 3 BITS
  2454.   CMP AX,2
  2455.   IF NC RET        ;ONLY 0FF INSTRUCTION CAN USE HIGHER
  2456.   SHL AX,1        ;DOUBLE IT
  2457.   CALL LFX
  2458.   JMP MODRMBITS
  2459.  
  2460. LFF:
  2461.   MOV BP,6
  2462.   MOV BX,OFFSET REGW
  2463.   MOV B[BW],'W'
  2464.   CALL GETBYTE2
  2465.   SUB DI,2        ;WRITE OVER BLANK
  2466.   MOV CL,3
  2467.   SHR AX,CL        ;LOOK AT R BITS
  2468.   AND AX,7        ;CLEAR ALL BUT LOW 3 BITS
  2469.   CMP AL,7
  2470.   IF Z RET        ;NO INSTRUCTION FOR THIS
  2471.   CMP AL,3
  2472.   IF Z MOV B[BW],'D'
  2473.   CMP AL,5
  2474.   IF Z MOV B[BW],'D'
  2475.   SHL AX,1        ;DOUBLE IT
  2476.   CALL LFX
  2477.   JMP MODRMBITS
  2478.  
  2479. LFX:
  2480.   MOV SAVEBX,BX
  2481.   MOV BX,OFFSET ISGGPTRS
  2482.   ADD BX,BP
  2483.   MOV BX,[BX]
  2484.   ADD BX,AX
  2485.   PUSH SI
  2486.   MOV SI,[BX]        ;POINT TO STRING
  2487. ISGGLP2:
  2488.   LODSB
  2489.   STOSB
  2490.   INC DI
  2491.   CMP AL,' '
  2492.   JNZ ISGGLP2
  2493.   POP SI
  2494.   MOV BX,SAVEBX
  2495.   RET
  2496.  
  2497. RELATIVE:
  2498.   MOV CX,CS
  2499.   MOV DS,CX
  2500.   MOV BX,ABSLOC1    ;HIGH NIBBLE OF CURRENT LOCATION
  2501.   ADD DX,ABSLOC2    ;ADD NEXT INSTR ADDR TO LOW NIBBLES OF CURRENT LOCATION
  2502.   IF O ADD BX,01000
  2503.   TEST DX,08000
  2504.   JZ >L1        ;IF HI BIT NOT SET
  2505.   TEST AX,08000
  2506.   JZ >L05        ;IF HI BIT NOT SET
  2507.   ADD DX,AX
  2508.   JMP SHORT >L2
  2509. L05:
  2510.   ADD DX,AX
  2511.   IF O ADD BX,01000
  2512.   JMP SHORT >L2
  2513. L1:
  2514.   TEST AX,08000
  2515.   JZ >L15        ;IF HI BIT NOT SET
  2516.   ADD DX,AX
  2517.   IF O SUB BX,01000
  2518.   JMP SHORT >L2
  2519. L15:
  2520.   ADD DX,AX
  2521. L2:
  2522.   MOV CH,1
  2523.   CALL BIN2HEX
  2524.   MOV BX,DX
  2525.   MOV CH,4
  2526.   JMP BIN2HEX
  2527.  
  2528. GETBYTE2:
  2529.   CALL SHOBYTE
  2530.   MOV DS,TOPLEF
  2531.   LODSB         ;2ND BYTE
  2532.   MOV CX,CS
  2533.   MOV DS,CX
  2534.   MOV BYTE2,AL
  2535.   RET
  2536.  
  2537. ;GET N BIT INFO (2ND BYTE = 2MOD BITS, 3 N BITS, & 3 R/M BITS)
  2538. NBITS:
  2539.   MOV AL,BYTE2
  2540.   MOV CL,3
  2541.   SHR AX,CL        ;LOOK AT 3 REG BITS
  2542.   AND AX,7
  2543.   SHL AX,1        ;DOUBLE IT
  2544.   PUSH SI
  2545.   MOV SI,BX        ;EITHER OFFSET REGB OR REGW OR [ISGGPTRS]
  2546.   ADD SI,AX
  2547.   MOVSB
  2548.   INC DI
  2549.   MOVSB
  2550.   INC DI
  2551.   POP SI
  2552.   RET
  2553.  
  2554. ;GET MOD & R/M BIT INFO
  2555. MODRMBITS:
  2556.   MOV AL,BYTE2
  2557.   MOV DL,AL
  2558.   AND AX,7        ;TO JUST LOOK AT R/M BITS
  2559.   MOV CL,6
  2560.   SHR DL,CL        ;LOOK AT 2 MOD BITS
  2561.   CMP DL,3        ;11B
  2562.   JNZ NOTREG        ;MOD R/M IS NOT TREATED AS A REGISTER
  2563.   SHL AX,1        ;DOUBLE IT
  2564.   PUSH SI
  2565.   MOV SI,BX        ;POINTING TO EITHER REGB OR REGW
  2566.   ADD SI,AX
  2567.   MOVSB
  2568.   INC DI
  2569.   MOVSB
  2570.   INC DI
  2571.   POP SI
  2572.   RET
  2573.  
  2574. NOTREG:
  2575.   OR DL,DL        ;MOD BITS
  2576.   JNZ USEADDR
  2577.   CMP AL,6        ;110B
  2578.   JNZ USEADDR        ;IF R/M BITS <> 110B
  2579. ;SPECIAL CASE (HIGH ADDRESS, LOW ADDRESS)
  2580.   MOV AL,BW
  2581.   STOSB
  2582.   INC DI
  2583.   MOV AL,'['
  2584.   STOSB
  2585.   INC DI
  2586. ADDRESS:
  2587.   INC SI
  2588.   CALL BIN2HEXB
  2589.   SUB SI,2
  2590.   CALL BIN2HEXB
  2591.   INC SI
  2592.   MOV AL,']'
  2593.   STOSB
  2594.   INC DI
  2595.   RET
  2596.  
  2597. USEADDR:
  2598.   PUSH AX
  2599.   MOV AL,[BW]
  2600.   STOSB
  2601.   INC DI
  2602.   POP AX
  2603.   MOV CL,3
  2604.   SHL AX,CL        ;MUL 8 (TO INDEX INTO ADDR)
  2605.   PUSH SI
  2606.   MOV SI,OFFSET ADDR
  2607.   ADD SI,AX
  2608. ADDRLP:
  2609.   MOVSB
  2610.   INC DI
  2611.   CMP B[SI],' '
  2612.   JNZ ADDRLP
  2613.   POP SI
  2614.   OR DL,DL        ;MOD BITS
  2615.   IF Z RET        ;IF NO EXTRA DISPLACEMENT
  2616.   SUB DI,2        ;WRITE OVER ']'
  2617.   MOV AL,'+'
  2618.   STOSB
  2619.   INC DI
  2620.   CMP DL,1
  2621.   JNZ ADDRESS        ;IF FOLLOWING BYTE IS NOT SIGN-EXTENDED TO WORD
  2622.   MOV DS,TOPLEF
  2623.   MOV CX,CS
  2624.   TEST B[SI],080
  2625.   JZ NOTNEG        ;IF HIGH BIT NOT SET
  2626.   NEG B[SI]
  2627.   ES MOV B[DI-2],'-'
  2628. NOTNEG:
  2629.   MOV DS,CX
  2630.   CALL BIN2HEXB
  2631.   MOV AL,']'
  2632.   STOSB
  2633.   INC DI
  2634.   RET
  2635.  
  2636. SHOBYTE:
  2637.   PUSH DI
  2638.   MOV AL,INSTRATTRIB
  2639.   CMP MODE,7
  2640.   IF Z MOV AL,070
  2641.   MOV AH,'_'
  2642.   MOV DI,SCRNCUR
  2643.   CMP B ES:[DI-1],0
  2644.   IF Z MOV ES:[DI-1],AH
  2645.   CMP B ES:[DI-1],020
  2646.   IF Z MOV ES:[DI-1],AH
  2647.   CMP B ES:[DI-1],0FF
  2648.   IF Z MOV ES:[DI-1],AH
  2649.   STOSB     ;HILITE BYTE
  2650.   POP DI
  2651.   ADD SCRNCUR,2
  2652.   RET
  2653.  
  2654. SHOWORD:
  2655.   PUSH DI
  2656.   MOV AL,INSTRATTRIB
  2657.   CMP MODE,7
  2658.   IF Z MOV AL,070
  2659.   MOV AH,'_'
  2660.   MOV DI,SCRNCUR
  2661.   CMP B ES:[DI-1],0
  2662.   IF Z MOV ES:[DI-1],AH
  2663.   CMP B ES:[DI-1],020
  2664.   IF Z MOV ES:[DI-1],AH
  2665.   CMP B ES:[DI-1],0FF
  2666.   IF Z MOV ES:[DI-1],AH
  2667.   STOSB     ;HILITE BYTE
  2668.   INC DI
  2669.   CMP B ES:[DI-1],0
  2670.   IF Z MOV ES:[DI-1],AH
  2671.   CMP B ES:[DI-1],020
  2672.   IF Z MOV ES:[DI-1],AH
  2673.   CMP B ES:[DI-1],0FF
  2674.   IF Z MOV ES:[DI-1],AH
  2675.   STOSB     ;DITTO
  2676.   POP DI
  2677.   ADD SCRNCUR,4
  2678.   SUB BP,BP
  2679.   RET
  2680.  
  2681. OLDSCR EQU $
  2682. PREBUF EQU OLDSCR +0FB0  ;4000D + 10H = (25*80) + ROOM TO ZERO LOW NIBBLE
  2683.  
  2684.